https://github.com/threepointone/genno
async transforms / flow control with js-csp
https://github.com/threepointone/genno
Last synced: 2 months ago
JSON representation
async transforms / flow control with js-csp
- Host: GitHub
- URL: https://github.com/threepointone/genno
- Owner: threepointone
- Created: 2015-04-09T08:45:26.000Z (about 10 years ago)
- Default Branch: master
- Last Pushed: 2015-04-09T09:28:37.000Z (about 10 years ago)
- Last Synced: 2025-01-25T08:11:39.109Z (4 months ago)
- Language: JavaScript
- Size: 129 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
genno
---`npm install genno`
async array transformations and flow control with generators and channels (via [js-csp](https://github.com/ubolonton/js-csp))
- reduce, reduceRight
- map, mapSeries
- filter, filterSeries
- concurrent, series, waterfall```js
var {go, chan, putAsync, timeout} = require('js-csp'),
{map, mapSeries, filter, reduce, concurrent, series, waterfall} = require('genno');// first, a helper to get a channel for a request
function fetch(url){
var ch = chan();
// make a request, put its response on a channel
require('superagent').get(url).end((err, res)=> {putAsync(ch, err || res); ch.close();});
return ch;
}// some sample urls
var urls = [
'http://www.google.com',
'http://www.jlongster.com',
'http://www.myntra.com'];// start a new go block
go(function*(){
// do a bunch of requests in parallel,
// and save their response lengths
yield map(urls, function*(url){
return (yield fetch(url)).text.length;
}); // [ 19643, 12148, 285823 ]
// neat!// async filter like a boss
yield filter(urls, function*(url){
return (yield fetch(url)).text.length > 100000;
}); // [ 'http://www.myntra.com']
// also available, filterSeries// arbitrary reduce
yield reduce(urls, function*(weight, url){
return weight + (yield fetch(url)).text.length
}, 0); // 319457
// also available, reduceRightyield concurrent([
function*(){ yield timeout(800); return 'a'; },
function*(){ yield timeout(200); return 'b'; },
function*(){ yield timeout(300); return 'c'; }]);
// ['a', 'b', 'c' ], time taken 800ms
yield series([
function*(){ yield timeout(800); return 'a'; },
function*(){ yield timeout(200); return 'b'; },
function*(){ yield timeout(300); return 'c'; }]);
// ['a', 'b', 'c' ], time taken 1300msyield waterfall([
function*(x){ yield timeout(800); return x*2 },
function*(x){ yield timeout(200); return x+5 },
function*(x){ yield timeout(300); return x*x }], 2);
// 81, time taken 1300ms
});
```