----------------------------------------------------------------------------- -- | -- Module : Control.Monad.Indexed -- Copyright : (C) 2008 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett -- Stability : experimental -- Portability : non-portable (rank-2 polymorphism) -- ---------------------------------------------------------------------------- module Control.Monad.Indexed ( module Control.Applicative.Indexed , IxMonad(..) , ijoin, (>>>=) , iapIxMonad ) where import Control.Arrow import Control.Applicative.Indexed import Control.Monad class IxApplicative m => IxMonad m where ibind :: (a -> m j k b) -> m i j a -> m i k b ijoin :: IxMonad m => m i j (m j k a) -> m i k a ijoin = ibind id infixl 1 >>>= (>>>=) :: IxMonad m => m i j a -> (a -> m j k b) -> m i k b m >>>= k = ibind k m instance (Pointed m, Applicative m, Monad m) => IxMonad (LiftIx m) where ibind f m = LiftIx (lowerIx m >>= lowerIx . f) instance IxMonad m => Monad (LowerIx m i) where return = LowerIx . ireturn m >>= f = LowerIx (liftIx m >>>= liftIx . f) iapIxMonad :: IxMonad m => m i j (a -> b) -> m j k a -> m i k b iapIxMonad f x = f >>>= \ f' -> x >>>= \x' -> ireturn (f' x')