We rewrite the Box example using lazy evaulation.
Here is Box example:
const Box = (x) => ({
map: f => Box(f(x)),
fold: f => f(x)
});
const res = Box(' 64 ')
.map(abba => abba.trim())
.map(trimmed => new Number(trimmed))
.map(number => number + 1)
.map(x => String.fromCharCode(x))
.fold(x => x.toLowerCase());
console.log(res); // 'a'
So how to make it as Lazy Box? The Answer is instead of passing a value to the Box, we pass and function into it.
const LazyBox = (fn) => ({
map: g => LazyBox(() => g(fn())),
fold: g => g(fn()) // call the g()
});
const res = LazyBox(() => ' 64 ')
.map(abba => abba.trim())
.map(trimmed => new Number(trimmed))
.map(number => number + 1)
.map(x => String.fromCharCode(x))
.fold(x => x.toLowerCase());
console.log(res); // 'a'
inside map function, we use function defination:
() => g(fn())
Just defined, but not call. Using g() is to make it composeable.
When actually 'fold', we call fn():
fold: g => g(fn()) // call the g()
One important thing to take away, to make it lazy, wrap into a function