----------------------------------------------------------------------------- -- -- Module : Control.Monad.Acme -- Copyright : -- License : AllRightsReserved -- -- Maintainer : -- Stability : -- Portability : -- -- | -- ----------------------------------------------------------------------------- module Control.Monad.Acme ( Acme(..) , AcmeT(..) ) where import Unsafe.Coerce (unsafeCoerce) newtype Acme a = Acme { runAcme :: a } newtype (Monad m) => AcmeT m a = AcmeT { runAcmeT :: m a } instance Monad Acme where return = Acme Acme x >>= f = f x fail = return . unsafeCoerce instance (Monad m) => Monad (AcmeT m) where return = AcmeT . return AcmeT m >>= f = AcmeT $ m >>= runAcmeT . f fail = return . unsafeCoerce