-- | Parametrized monad, by Oleg Kiselyov
-- <http://okmij.org/ftp/Computation/monads.html#param-monad>
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)