Skip to content
⬅️ Do notation for Fantasy Land monad types
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
test
.coveralls.yml
.gitignore
.travis.yml
LICENSE
README.md
index.js
package.json

README.md

Do Notation

Build Status Coverage Status

Do notation for Fantasy Land monad types.

Fantasy Land

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 }
You can’t perform that action at this time.