module Control.Monad.StarToStar.Fix where
import Data.StarToStar (Fix(..))
import Data.StarToStar.Iso (Iso(..))
import Control.Monad (MonadPlus(..))
import Control.Monad.Fix (MonadFix(..))
import Control.Monad.Trans (MonadIO(..))
import Control.Monad.Reader.Class (MonadReader(..))
import Control.Monad.Writer.Class (MonadWriter(..))
import Control.Monad.State.Class (MonadState(..))
import Control.Monad.RWS.Class (MonadRWS(..))
import Control.Monad.Error.Class (MonadError(..))
import Control.Monad.Cont.Class (MonadCont(..))
instance (Iso (Fix ff), Monad (Other (Fix ff))) => Monad (Fix ff) where
return = to . return
m >>= k = to (from m >>= from . k)
instance (Iso (Fix ff), MonadPlus (Other (Fix ff))) => MonadPlus (Fix ff) where
mzero = to mzero
mplus m1 m2 = to $ (from m1) `mplus` (from m2)
instance (Iso (Fix ff), MonadFix (Other (Fix ff))) => MonadFix (Fix ff) where
mfix f = to $ mfix $ \a -> from (f a)
instance (Iso (Fix ff), MonadIO (Other (Fix ff))) => MonadIO (Fix ff) where
liftIO = to . liftIO
instance (Iso (Fix ff), MonadReader r (Other (Fix ff))) => MonadReader r (Fix ff) where
ask = to ask
local g = to . (local g) . from
instance (Iso (Fix ff), MonadWriter w (Other (Fix ff))) => MonadWriter w (Fix ff) where
tell = to . tell
listen = to . listen . from
pass = to . pass . from
instance (Iso (Fix ff), MonadState s (Other (Fix ff))) => MonadState s (Fix ff) where
get = to get
put = to . put
instance (Iso (Fix ff), MonadRWS r w s (Other (Fix ff))) => MonadRWS r w s (Fix ff)
instance (Iso (Fix ff), MonadError r (Other (Fix ff))) => MonadError r (Fix ff) where
throwError = to . throwError
m `catchError` h = to $ (from m) `catchError` (from . h)
instance (Iso (Fix ff), MonadCont (Other (Fix ff))) => MonadCont (Fix ff) where
callCC f = to $ callCC (from . f . (to .))