首页 > 代码库 > [Compose] 9. Delay Evaluation with LazyBox

[Compose] 9. Delay Evaluation with LazyBox

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()

 

[Compose] 9. Delay Evaluation with LazyBox