Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Трансдьюсеры — это попытка переосмыслить операции над коллекциями, такие как map(), filter() и пр., найти в них общую идею, и научиться совмещать вместе несколько операций для дальнейшего переиспользования.thedeemon.livejournal.com/87320.html
static class MySyperExtension
{
public static IEnumerable<TResult> MySuperMegaOperation(IEnumerable<TSource> source)
{
return source.Where(...).Aggeregate(...). //тут можно быть что-то еще
}
}
//вызывать потом можно так:
var result = myCollection.MySuperMegaOperation()
public class SomeClass
{
public void SomeMethod<TSource,TResult>(Func<IEnumerable<TSource>, IEnumerable<TResult>> processor)
{
var myCollection = new List<TSource>()
var result = processor.Invoke(source);
}
}
let MySuperMegaOperation source =
source |> Seq.map(fun x -> x + 1) |> Seq.filter(fun x -> x < 4)
MySuperMegaOperation [|1; 2; 3; 4|]
var addOne = (ctx, x, next) => next(x + 1),
lessThan4 = (ctx, x, next) => x < 4 && next(x),
append = (ctx, x) => ctx.push(x);
console.log(test(addOne, lessThan4, append));
console.log(test(lessThan4, addOne, append));
// test
function test(...fns) {
return [1, 2, 3, 4].reduce(runner(fns), [])
}
// implementation
function runner(fns){
return function(ctx, x){
var i = -1;
function next(x){
if (++i < fns.length)
fns[i](ctx, x, next);
}
next(x);
return ctx;
};
}
var through2 = require("through2"),
addOne, lessThan4, append,
transStream, input, result;
addOne = (x, next) => next(x+1);
lessThan4 = (x, next) => x < 4 && next(x);
append = (ctx) => (x, next) => {ctx.push(x); next();};
transStream = (fn) => through2.obj((hunk, enc, cb) => {
fn(hunk, cb);
});
(input = transStream(addOne))
.pipe(transStream(lessThan4))
.pipe(transStream(append(result = [])))
.on("finish", () => console.log('result', result));
[1,2,3,4].forEach((item) => input.write(item));
var es6transpiler = require('es6-transpiler');
// node_inject_on перехватывает вызовы require и транслирует es6-код в es5
es6transpiler.node_inject_on(function(fileName){
return fileName.endsWith(".es6.js");
});
require("./main.es6.js");// запускаем программу написанную на es6
es6transpiler.node_inject_off();
let coll = [1, 2, 3, 4];
let addOne = (x) => x + 1;
let filterFn = (x) => x < 4;
coll = [ for (item of coll) if ( filterFn(item = addOne(item)) ) item ];
coll = ( for (item of coll) if ( filterFn(item = addOne(item)) ) item );
coll.next();
Это что-то вроде Streams в Java 8?
var addOne_lessTnan4 = function(step) { return lessTnan4T(addOneT(step)); } // или, что вообще замечательно, можно использовать функцию _.compose var addOne_lessTnan4 = _.compose(addOneT, lessTnan4T);
var addOne_lessTnan4 = _.compose(lessTnan4T, addOneT);
var addOne_lessTnan4 = function(step) { return lessTnan4T(addOneT(step)); } var addOne_lessTnan4_composition = _.compose(addOneT, lessTnan4T); _.reduce([1, 2, 3, 4], addOne_lessTnan4(append), []); // [2, 3, 4] _.reduce([1, 2, 3, 4], addOne_lessTnan4_composition(append), []); // [2, 3]
Трансдьюсеры в JavaScript. Часть первая