{- 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)