{-# LANGUAGE UndecidableInstances #-}
module Control.Monad.Changeset.Class where
import Control.Monad.Trans.Class (MonadTrans (..))
import Control.Monad.Morph (MFunctor (..))
import Data.Monoid.RightAction (RightAction)
class (Monad m, Monoid w, RightAction w s) => MonadChangeset s w m | m -> s, m -> w where
changeset ::
(s -> (a, w)) ->
m a
change :: w -> m ()
current :: m s
instance {-# OVERLAPPABLE #-} (Monad m, Monad (t m), MonadTrans t, MFunctor t, MonadChangeset s w m) => MonadChangeset s w (t m) where
changeset :: forall a. (s -> (a, w)) -> t m a
changeset = m a -> t m a
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> t m a) -> ((s -> (a, w)) -> m a) -> (s -> (a, w)) -> t m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (s -> (a, w)) -> m a
forall a. (s -> (a, w)) -> m a
forall s w (m :: * -> *) a.
MonadChangeset s w m =>
(s -> (a, w)) -> m a
changeset
change :: w -> t m ()
change = m () -> t m ()
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> t m ()) -> (w -> m ()) -> w -> t m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. w -> m ()
forall s w (m :: * -> *). MonadChangeset s w m => w -> m ()
change
current :: t m s
current = m s -> t m s
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m s
forall s w (m :: * -> *). MonadChangeset s w m => m s
current