packages feed

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)