do-notation
v1.0.5
Published
Do notation for Fantasy Land monad types
Downloads
16
Maintainers
Readme
Do Notation
Do notation for Fantasy Land monad types.
Examples
It uses yield to "unbox" the Monad (the <- in Haskell), which can then be transformed and fed to the next Monad in the Do block. The Do function returns the last Monad in the Do block:
const Do = require('do-notation')
let maybeString = Do(function*() {
let foo = yield S.Maybe.of('foo')
console.log(foo)
// 'foo'
let bar = yield S.Maybe.of('bar' + foo)
console.log(bar)
// 'barfoo'
let baz = yield S.Maybe.of('baz' + bar)
console.log(baz)
// 'bazbarfoo'
}).toString()
console.log(maybeString)
// 'Just("bazbarfoo")'Implementation
The entire implementation is very succinct and simple:
Do = function(generatorFunction) {
const generator = generatorFunction()
return function next(error, v) {
const res = generator.next(v)
if (res.done)
return res.value
else
return res.value.chain((v) => next(null, v) || res.value.of(v))
}()
}
module.exports = { Do: Do }
