We examine the data structure Task, see some constructors, familiar methods, and finally how it captures side effects through laziness.
We are going to check two libarays, one is 'data.task'. another is 'crocks/Async':
Install:
npm i -S data.task
npm i -S crocks
You can use 'of' construct method:
Task.of(1) .fork(e => console.error(e), a => console.log(a)) // 1 Async.of('U Wut M8') .fork(e => console.error(e),a => console.log(a)) // U Wut M8
You can do rejection:
// Foucs to reject: Task.rejected('not work') .fork(e => console.error(e), a => console.log(a)) // not work Async.Rejected('Async badguy') .fork(e => console.error(e),a => console.log(a)) // Async badguy
You can .map / .chain:
Task.of(1) .map(x => x + 1) .fork(e => console.error(e), a => console.log(a)) // 2 Task.rejected(1) .map(x => x + 1) .fork(e => console.error(e), a => console.log(a)) // 1 Async.of(1) .map(x => x + 1) .fork(e => console.error(e),a => console.log(a)) //2 Async.Rejected(1) .map(x => x + 1) .fork(e => console.error(e),a => console.log(a)) // 1 Task.of(1) .map(x => x + 1) .chain(x => Task.of(x + 2)) .fork(e => console.error(e), a => console.log(a)) // 4 Async.of(1) .map(x => x + 1) .chain(x => Async.of(x + 2)) .fork(e => console.error(e),a => console.log(a)) // 4
You can use 'contructor function':
const lunchMissiles = () => new Task((rej, res) => { console.log('lunchMissiles'); res('missile!') }); const lunchRocky = () => Async((rej, res) => { console.log('lunchRocky'); res('Rocky!') }); lunchMissiles() .map(x => x + "!") .fork(e => console.error(e), a => console.log(a)) // lunchMissiles missile!! lunchRocky() .map(x => x + "!") .fork(e => console.error(e), a => console.log(a)) // lunchMissiles missile!!
Finally, we can split the side effect without calling 'fork', and you compose with the rest of app:
const taskApp = lunchMissiles() .map(x => x + "!"); const asyncApp = lunchRocky() .map(x => x + "!") taskApp.map(x => " From Task").fork(e => console.error(e), a => console.log(a)) asyncApp.map(x => " From Async").fork(e => console.error(e), a => console.log(a))