-- | Parametrized monad, by Oleg Kiselyov -- module Control.Concurrent.STM.Monadish where import Control.Monad.State -- | A parameterized `monad' class Monadish m where gret :: a -> m p p a gbind :: m p q a -> (a -> m q r b) -> m p r b -- | Inject regular monads to be monadish things too newtype MW m p q a = MW{ unMW:: m a } instance Monad m => Monadish (MW m) where gret = MW . return gbind (MW m) f = MW (m >>= unMW . f)