IxEnvM.hs

module IxEnvM (HasEnv(..), EnvM, withEnv) where

import MT
import Control_Monad_Fix


newtype EnvM e a  = E { ($$) :: e -> a }

withEnv :: e -> EnvM e a -> a
withEnv e f       = f $$ e 

mapEnv :: (e2 -> e1) -> EnvM e1 a -> EnvM e2 a
mapEnv f (E g)    = E (g . f)

instance Functor (EnvM e) where
  fmap f (E g)    = E (f . g)

instance Monad (EnvM e) where
  return x        = E (\e -> x)
  f >>= g         = E (\e -> g (f $$ e) $$ e)
  f >> g          = g

instance HasEnv (EnvM e) Top e where
  getEnv _        = E (\e -> e)
  inModEnv _      = mapEnv 
  inEnv _ e f     = return (f $$ e) 

instance MonadFix (EnvM e) where
  mfix f          = E (\e -> let a = f a $$ e in a)

instance HasBaseMonad (EnvM e) (EnvM e) where
  inBase          = id


Plain-text version of IxEnvM.hs | Valid HTML?