packages feed

monadology-0.1: src/Control/Monad/Ology/General/Cont.hs

module Control.Monad.Ology.General.Cont where

import Control.Monad.Ology.General.Trans.Constraint
import Control.Monad.Ology.General.Trans.Trans
import Control.Monad.Ology.General.Trans.Tunnel
import Import

class Monad m => MonadCont m where
    callCC :: ((a -> m b) -> m a) -> m a

instance (MonadTransTunnel t, MonadCont m, Monad (t m)) => MonadCont (t m) where
    callCC call =
        tunnel $ \unlift ->
            callCC $ \cont ->
                unlift $ call $ \a -> lift $ cont $ runIdentity $ unlift $ withTransConstraintTM @Monad $ return a