reactive-midyim-0.2: src/Reactive/Banana/MIDI/IndexedMonad.hs
{-
This module could as well live in a separate package.
-}
module Reactive.Banana.MIDI.IndexedMonad where
import Control.Applicative (Applicative, pure, (<*>), )
import Control.Monad (liftM, ap, )
class C m where
point :: a -> m s a
bind :: m s a -> (a -> m s b) -> m s b
newtype Wrap m s a = Wrap {unwrap :: m s a}
instance C m => Functor (Wrap m s) where
fmap = liftM
instance C m => Applicative (Wrap m s) where
pure = return
(<*>) = ap
instance C m => Monad (Wrap m s) where
return = Wrap . point
Wrap x >>= k = Wrap $ bind x (unwrap . k)