-----------------------------------------------------------------------------
--
-- 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