Transducers remove the requirement of being lazy to optimize for things like take(10)
. However, it can still be useful to "bind" a collection to a set of transformations and pass it around, without actually evaluating the transformations.
As noted above, whenever you apply transformations to an iterator it does so lazily. It's easy convert array transformations into a lazy operation, just use the utility function iterator
to grab an iterator of the array instead.
The whole point here is using 'iterator' from s lib. So you get control when you need the data.
import t from 'transducers.js';const doubleTheNumber = number => number * 2;export const evenOnly = number => number % 2 === 0;const doubleAndEven = t.compose( t.filter(evenOnly), t.map(doubleTheNumber),);const arr = [1,2,3,4,5,6,7,8,9,10];const res = t.seq( t.iterator(arr), t.compose(doubleAndEven, t.take(2)),);function* makeNumbers() { let num = 1; while (true) yield num++;}const lazyNums = t.seq(makeNumbers(), doubleAndEven);console.log( lazyNums.next(), lazyNums.next(), lazyNums.next(), lazyNums.next(), lazyNums.next(), lazyNums.next(),);