module Control.Comonad.Traced.Class
( ComonadTraced(..)
, traces
) where
import Control.Comonad
import Control.Comonad.Trans.Class
import qualified Control.Comonad.Trans.Traced as T
import Control.Comonad.Trans.Discont
import Control.Comonad.Trans.Env
import Control.Comonad.Trans.Store
import Control.Comonad.Trans.Identity
import Data.Monoid
class Comonad w => ComonadTraced m w | w -> m where
trace :: m -> w a -> a
traces :: ComonadTraced m w => (a -> m) -> w a -> a
traces f wa = trace (f (extract wa)) wa
instance (Comonad w, Monoid m) => ComonadTraced m (T.TracedT m w) where
trace = T.trace
lowerTrace :: (ComonadTrans t, ComonadTraced m w) => m -> t w a -> a
lowerTrace m = trace m . lower
instance ComonadTraced m w => ComonadTraced m (DiscontT k w) where
trace = lowerTrace
instance ComonadTraced m w => ComonadTraced m (IdentityT w) where
trace = lowerTrace
instance ComonadTraced m w => ComonadTraced m (EnvT e w) where
trace = lowerTrace
instance ComonadTraced m w => ComonadTraced m (StoreT s w) where
trace = lowerTrace