monad-branch-1.0.3: src/Control/Monad/Branch.hs
module Control.Monad.Branch where
import Prelude
import Control.Monad.Identity
import Control.Monad.Trans.Identity
import qualified Control.Monad.Trans.State as Lazy
import qualified Control.Monad.Trans.State.Strict as Strict
-------------------------
-- === MonadBranch === --
-------------------------
-- === Definition === --
class Monad m => MonadBranch m where
branched :: m a -> m a
-- === Standard instances === --
instance MonadBranch Identity where
branched = id
instance MonadBranch m => MonadBranch (IdentityT m) where
branched = mapIdentityT branched
instance MonadBranch m => MonadBranch (Lazy.StateT s m) where
branched (Lazy.StateT m) = Lazy.StateT $ \s -> (,s) . fst <$> branched (m s)
instance MonadBranch m => MonadBranch (Strict.StateT s m) where
branched (Strict.StateT m) = Strict.StateT $ \s -> (,s) . fst <$> branched (m s)