rebindable-0.1.0: src/Language/Haskell/Rebindable/Do.hs
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE GADTs #-}
module Language.Haskell.Rebindable.Do where
import Data.Default.Class
import Prelude hiding ((>>), (>>=), return, Monad)
import qualified Control.Monad.Indexed as P
import qualified Prelude as P
data Monad = Monad
{ return :: forall a m. (P.Monad m) => a -> m a
, (>>=) :: forall a b m. (P.Monad m) => m a -> (a -> m b) -> m b
, (>>) :: forall a b m. (P.Monad m) => m a -> m b -> m b
}
data IxMonad = IxMonad
{ return :: forall a i m. (P.IxMonad m) => a -> m i i a
, (>>=) :: forall a b i j k m. (P.IxMonad m) => m i j a -> (a -> m j k b) -> m i k b
, (>>) :: forall a b i j k m. (P.IxMonad m) => m i j a -> m j k b -> m i k b
}
instance Default Monad where
def = Monad
{ return = P.return
, (>>=) = (P.>>=)
, (>>) = (P.>>)
}
instance Default IxMonad where
def = IxMonad
{ return = P.ireturn
, (>>=) = (P.>>>=)
, (>>) = \a b -> a P.>>>= (\_ -> b)
}