├── .gitignore ├── .travis.yml ├── .jshintrc ├── .jscsrc ├── README.md ├── LICENSE ├── package.json ├── test └── ruff.js ├── lib └── ruff.js ├── ChangeLog └── dist ├── ruff.min.js └── ruff.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 5 4 | 5 | script: 6 | - npm run codestyle 7 | - npm test 8 | 9 | notifications: 10 | email: 11 | on_success: never 12 | on_failure: change 13 | 14 | sudo: false 15 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esnext": true, 3 | "unused" : true, 4 | "bitwise" : false, 5 | "browser" : true, 6 | "devel" : true, 7 | "eqeqeq" : true, 8 | "jquery" : false, 9 | "newcap" : false, 10 | "noarg" : true, 11 | "node" : true, 12 | "noempty" : true, 13 | "nonew" : true, 14 | "strict" : true, 15 | "undef" : true, 16 | "evil" : true, 17 | "expr" : true, 18 | "quotmark": "single", 19 | "validthis": true 20 | } 21 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "crockford", 3 | "requireSpaceAfterKeywords": false, 4 | "requireCapitalizedConstructors": false, 5 | "disallowTrailingWhitespace": "ignoreEmptyLines", 6 | "disallowTrailingComma": false, 7 | "disallowUnusedVariables": true, 8 | "validateIndentation": false, 9 | "requireCurlyBraces": false, 10 | "requireVarDeclFirst": false, 11 | "requireMultipleVarDecl": false, 12 | "requireUseStrict": true, 13 | "requireSpacesInAnonymousFunctionExpression": { 14 | "beforeOpeningCurlyBrace": true 15 | }, 16 | "disallowDanglingUnderscores": false, 17 | "excludeFiles": [ 18 | "node_modules/**" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ruff 2 | 3 | Coroutine with ES6 generators simple as never before. 4 | 5 | ## Install 6 | 7 | ``` 8 | npm i ruff --save 9 | ``` 10 | 11 | ## How to use? 12 | 13 | ```js 14 | var ruff = require('ruff'), 15 | minify = require('minify'); 16 | 17 | ruff(function*() { 18 | var mini = minify.bind(null, 'lib/ruff.js'), 19 | result = yield mini; 20 | 21 | console.log(result) 22 | }).on('error', function(error) { 23 | console.log(error); 24 | }); 25 | ``` 26 | ### Parallel execution 27 | 28 | `ruff` supports parallel execution. 29 | 30 | ```js 31 | var ruff = require('ruff'), 32 | minify = require('minify'); 33 | 34 | ruff(function*() { 35 | var first = minify.bind(null, '1.js'), 36 | second = minify.bind(null, '2.js'); 37 | 38 | yield [first, second]; 39 | console.log('done'); 40 | }).on('error', function(error) { 41 | console.log(error); 42 | }).on('end', function() { 43 | console.log('ok what\'s next?'); 44 | }); 45 | ``` 46 | 47 | ## License 48 | 49 | MIT 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2016 coderaiser 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ruff", 3 | "version": "1.5.4", 4 | "description": "Coroutine with ES6 generators simpler then ever", 5 | "main": "lib/ruff.js", 6 | "dependencies": { 7 | "emitify": "^3.0.1" 8 | }, 9 | "devDependencies": { 10 | "browserify": "^16.0.0", 11 | "currify": "^2.0.2", 12 | "jscs": "^3.0.3", 13 | "jshint": "^2.8.0", 14 | "minify": "^3.0.0", 15 | "tape": "^4.2.2" 16 | }, 17 | "scripts": { 18 | "test": "tape test/*.js", 19 | "bundle:base": "browserify -s ruff --ng false", 20 | "bundle": "npm run bundle:base -- -r ./lib/ruff.js:ruff ./lib/ruff.js -o dist/ruff.js", 21 | "minify": "minify dist/ruff.js > dist/ruff.min.js", 22 | "build": "npm-run-all bundle minify", 23 | "jshint": "jshint lib", 24 | "jscs": "jscs --esnext lib test", 25 | "codestyle": "npm-run-all jshint jscs", 26 | "wisdom": "npm run build" 27 | }, 28 | "repository": { 29 | "type": "git", 30 | "url": "https://github.com/coderaiser/ruff.git" 31 | }, 32 | "keywords": [ 33 | "generators", 34 | "es6" 35 | ], 36 | "author": "coderaiser (http://coderaiser.github.io/)", 37 | "license": "MIT", 38 | "bugs": { 39 | "url": "https://github.com/coderaiser/ruff/issues" 40 | }, 41 | "homepage": "https://github.com/coderaiser/ruff" 42 | } 43 | -------------------------------------------------------------------------------- /test/ruff.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | let test = require('tape'); 4 | let currify = require('currify'); 5 | let ruff = require('..'); 6 | 7 | let add = (a, b, fn) => 8 | setTimeout(() => fn(null, a + b), 0); 9 | 10 | let addy = currify(add); 11 | 12 | test('call series of async functions', t => { 13 | ruff(function*() { 14 | let c = yield addy(1, 2); 15 | t.equal(c, 3, 'should return result in variable'); 16 | t.end(); 17 | }); 18 | }); 19 | 20 | test('call error listener', t => { 21 | let fn = cb => setTimeout(() => cb('hello'), 0); 22 | 23 | ruff(function*() { 24 | yield fn; 25 | }).on('error', error => { 26 | t.equal(error, 'hello', 'should emit error event'); 27 | t.end(); 28 | }); 29 | }); 30 | 31 | test('call end listener', t => { 32 | let fn = cb => setTimeout(() => cb(), 0); 33 | 34 | ruff(function*() { 35 | yield fn; 36 | }).on('end', () => { 37 | t.end(); 38 | }); 39 | }); 40 | test('when no generetor', t => { 41 | t.throws(ruff, /generator could not be empty!/, 'should throw when generator empty'); 42 | t.end(); 43 | }); 44 | 45 | test('when no generetor', t => { 46 | let fn = () => ruff(function*() {}, 'hi'); 47 | t.throws(fn, /args should be array!/, 'should throw when arguments present and not array'); 48 | t.end(); 49 | }); 50 | -------------------------------------------------------------------------------- /lib/ruff.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var emitify = require('emitify/legacy'); 4 | 5 | module.exports = ruff; 6 | 7 | function ruff(generator, args) { 8 | var gen, 9 | events = emitify(); 10 | 11 | if (!generator) 12 | throw Error('generator could not be empty!'); 13 | 14 | if (args && !Array.isArray(args)) 15 | throw Error('args should be array!'); 16 | 17 | gen = generator.apply(null, args || []); 18 | 19 | function nextItem(error, result) { 20 | var item = gen.next(result); 21 | 22 | if (error) 23 | events.emit('error', error); 24 | else if (!item.done) 25 | if (Array.isArray(item.value)) 26 | parallel(item.value, nextItem); 27 | else 28 | item.value(nextItem); 29 | 30 | if (item.done) 31 | events.emit('end'); 32 | } 33 | 34 | nextItem(); 35 | 36 | return events; 37 | } 38 | 39 | function parallel(arr, callback) { 40 | var done, 41 | i = arr.length, 42 | fn = function(error) { 43 | --i; 44 | 45 | if (!i && !done || error) { 46 | done = true; 47 | callback(error); 48 | } 49 | }; 50 | 51 | arr.forEach(function(item) { 52 | item(fn); 53 | }); 54 | } 55 | -------------------------------------------------------------------------------- /ChangeLog: -------------------------------------------------------------------------------- 1 | 2017.04.28, v1.5.4 2 | 3 | feature: 4 | - (package) emitify v3.0.1 5 | - (package) browserify v14.0.0 6 | - (package) currify v2.0.2 7 | 8 | 9 | 2016.06.06, v1.5.3 10 | 11 | feature: 12 | - (package) emitify v2.1.0 13 | - (package) jscs v3.0.3 14 | - (package) browserify v13.0.0 15 | 16 | 17 | 2015.12.29, v1.5.2 18 | 19 | feature: 20 | - (package) emitify v2.0.0 21 | 22 | 23 | 2015.11.25, v1.5.1 24 | 25 | feature: 26 | - (ruff) events -> emitify 27 | 28 | 29 | 2015.11.24, v1.5.0 30 | 31 | feature: 32 | - (ruff) add browserify 33 | - (ruff) add test 34 | 35 | 36 | 2015.04.02, v1.4.1 37 | 38 | feature: 39 | - (ruff) if -> || 40 | 41 | 42 | 2015.04.01, v1.4.0 43 | 44 | feature: 45 | - (ruff) add args 46 | 47 | 48 | 2015.04.01, v1.3.1 49 | 50 | fix: 51 | - (ruff) call, check -> check, call 52 | 53 | feature: 54 | - (package) v1.3.0 55 | - (ruff) add EventEmitter, when on node, update Emitify 56 | 57 | 58 | 2015.03.19, v1.3.0 59 | 60 | feature: 61 | - (ruff) add EventEmitter, when on node, update Emitify 62 | - (package) description: coroutine 63 | 64 | 65 | 2015.01.15, v1.2.0 66 | 67 | feature: 68 | - (ruff) make emit private 69 | 70 | 71 | 2015.01.15, v1.1.0 72 | 73 | feature: 74 | - (ruff) add support of parallel execution 75 | 76 | 77 | 2015.01.15, v1.0.3 78 | 79 | fix: 80 | - (ruff) Events on return: events -> this 81 | 82 | 83 | 2015.01.15, v1.0.2 84 | 85 | fix: 86 | - (ruff) create events for every ruff scrope 87 | - Merge pull request #1 from stoeffel/events 88 | - events 89 | 90 | 91 | 2015.01.15, v1.0.1 92 | 93 | fix: 94 | - (ruff) index -> lib/ruff 95 | 96 | -------------------------------------------------------------------------------- /dist/ruff.min.js: -------------------------------------------------------------------------------- 1 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.ruff=e()}}(function(){return function e(t,r,n){function o(f,u){if(!r[f]){if(!t[f]){var c="function"==typeof require&&require;if(!u&&c)return c(f,!0);if(i)return i(f,!0);var s=new Error("Cannot find module '"+f+"'");throw s.code="MODULE_NOT_FOUND",s}var l=r[f]={exports:{}};t[f][0].call(l.exports,function(e){var r=t[f][1][e];return o(r?r:e)},l,l.exports,e,t,r,n)}return r[f].exports}for(var i="function"==typeof require&&require,f=0;f