genno
v1.0.2
Published
flow control / async transforms with js-csp and generators
Downloads
6
Readme
genno
npm install genno
async array transformations and flow control with generators and channels (via js-csp)
- reduce, reduceRight
- map, mapSeries
- filter, filterSeries
- concurrent, series, waterfall
var {go, chan, putAsync, timeout} = require('js-csp'),
{map, mapSeries, filter, reduce, concurrent, series, waterfall} = require('./index.js');
// 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!
// the same, but in series
yield mapSeries(urls, function*(url){
return (yield fetch(url)).text.length;
}); // [ 19683, 12148, 285826 ]
// 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, reduceRight
yield 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 1300ms
yield waterfall([
function*(x){ yield timeout(800); return x*2 },
function*(x){ yield timeout(200); return x+5 },
function*(x){ yield timeout(300); return 'c'; }], 2);
// 81, time taken 1300ms
});