module Control.ContStuff.Instances () where
import qualified Control.Exception as E
import Control.ContStuff.Classes
import Control.ContStuff.Trans
import Control.Monad.ST
instance HasExceptions (Either e) where
type Exception (Either e) = e
raise = Left
try = Right
instance HasExceptions Maybe where
type Exception Maybe = ()
raise = const Nothing
try = Just . maybe (Left ()) Right
instance HasExceptions IO where
type Exception IO = E.SomeException
raise = E.throwIO
try = E.try
instance LiftBase Id where type Base Id = Id; base = id
instance LiftBase IO where type Base IO = IO; base = id
instance LiftBase Maybe where type Base Maybe = Maybe; base = id
instance LiftBase (ST s) where type Base (ST s) = ST s; base = id
instance LiftBase [] where type Base [] = []; base = id
instance LiftBase ((->) r) where type Base ((->) r) = (->) r; base = id
instance (LiftBase m, Monad m) => LiftBase (ChoiceT r i m) where
type Base (ChoiceT r i m) = Base m
base = lift . base
instance (LiftBase m, Monad m) => LiftBase (ContT r m) where
type Base (ContT r m) = Base m
base = lift . base
instance (LiftBase m, Monad m) => LiftBase (EitherT r e m) where
type Base (EitherT r e m) = Base m
base = lift . base
instance (LiftBase m, Monad m) => LiftBase (IdT m) where
type Base (IdT m) = Base m
base = lift . base
instance (LiftBase m, Monad m) => LiftBase (MaybeT r m) where
type Base (MaybeT r m) = Base m
base = lift . base
instance (LiftBase m, Monad m) => LiftBase (StateT r s m) where
type Base (StateT r s m) = Base m
base = lift . base
instance (Monad m, Stateful m) => Stateful (ChoiceT r i m) where
type StateOf (ChoiceT r i m) = StateOf m
get = lift get
put = lift . put
putLazy = lift . putLazy
instance (Monad m, Stateful m) => Stateful (ContT r m) where
type StateOf (ContT r m) = StateOf m
get = lift get
put = lift . put
putLazy = lift . putLazy
instance (Monad m, Stateful m) => Stateful (EitherT r e m) where
type StateOf (EitherT r e m) = StateOf m
get = lift get
put = lift . put
putLazy = lift . putLazy
instance (Monad m, Stateful m) => Stateful (IdT m) where
type StateOf (IdT m) = StateOf m
get = lift get
put = lift . put
putLazy = lift . putLazy
instance (Monad m, Stateful m) => Stateful (MaybeT r m) where
type StateOf (MaybeT r m) = StateOf m
get = lift get
put = lift . put
putLazy = lift . putLazy