safareli/free

Free with flipped type parameters is also a monad?

Opened this issue · 1 comments

//data FlipFree a i = FlipFree { flip :: Free i a }
const FlipFree = daggy.tagged('flip')

// same as `hoist`
// :: FlipFree z a ~> (a -> b) -> FlipFree z b
// FlipFree.prototype.map - TODO derive

// same as `???`
// :: FlipFree z (a -> b) -> FlipFree z a -> FlipFree z b
// FlipFree.prototype.ap - TODO derive


// ap                :: (Monad m) => m (a -> b) -> m a -> m b
// ap m1 m2          = do { x1 <- m1; x2 <- m2; return (x1 x2) }


// this is same as `graft`
// :: FlipFree z a ~> (a -> FlipFree z b) -> FlipFree z b
FlipFree.prototype.chain = function(f) {
  return FlipFree(this.flip.foldMap(v => f(v).flip, this.flip.constructor))
}