Skip to content

Commit beac8a0

Browse files
committed
Add remaining instances for Comonad transformers
1 parent be72ab5 commit beac8a0

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
lines changed

src/Control/Comonad/Env/Class.purs

+17-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
module Control.Comonad.Env.Class where
44

5+
import Prelude
6+
57
import Control.Comonad (class Comonad)
68
import Control.Comonad.Env.Trans (EnvT(..))
7-
9+
import Control.Comonad.Store (StoreT(..))
10+
import Control.Comonad.Traced.Trans (TracedT(..))
11+
import Control.Comonad.Trans.Class (lower)
812
import Data.Tuple (Tuple(..), fst)
913

1014
-- | The `ComonadEnv` type class represents those comonads which support a
@@ -44,3 +48,15 @@ instance comonadAskEnvT :: Comonad w => ComonadAsk e (EnvT e w) where
4448
instance comonadEnvEnvT :: Comonad w => ComonadEnv e (EnvT e w) where
4549
local f (EnvT x) = EnvT case x of
4650
Tuple y z -> Tuple (f y) z
51+
52+
instance comonadAskTracedT :: (ComonadAsk e w, Monoid t) => ComonadAsk e (TracedT t w) where
53+
ask = ask <<< lower
54+
55+
instance comonadEnvTracedT :: (ComonadEnv e w, Monoid t) => ComonadEnv e (TracedT t w) where
56+
local f (TracedT w) = TracedT (local f w)
57+
58+
instance comonadAskStoreT :: ComonadAsk e w => ComonadAsk e (StoreT s w) where
59+
ask = ask <<< lower
60+
61+
instance comonadEnvStoreT :: ComonadEnv e w => ComonadEnv e (StoreT s w) where
62+
local f (StoreT (Tuple w s)) = StoreT (Tuple (local f w) s)

src/Control/Comonad/Traced/Class.purs

+16
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ module Control.Comonad.Traced.Class where
55
import Prelude
66

77
import Control.Comonad (class Comonad, extract)
8+
import Control.Comonad.Env (EnvT)
9+
import Control.Comonad.Store (StoreT)
810
import Control.Comonad.Traced.Trans (TracedT(..))
11+
import Control.Comonad.Trans.Class (class ComonadTrans, lower)
12+
import Control.Monad.Identity.Trans (IdentityT)
913
import Data.Tuple (Tuple(..))
1014

1115
-- | The `ComonadTraced` type class represents those monads which support relative (monoidal)
@@ -47,3 +51,15 @@ censor f (TracedT tr) = TracedT ((f >>> _) <$> tr)
4751

4852
instance comonadTracedTracedT :: (Comonad w, Monoid t) => ComonadTraced t (TracedT t w) where
4953
track t (TracedT tr) = extract tr t
54+
55+
lowerTrack :: forall t m w a. ComonadTrans t => ComonadTraced m w => m -> t w a -> a
56+
lowerTrack m = track m <<< lower
57+
58+
instance comonadTracedIdentityT :: ComonadTraced t w => ComonadTraced t (IdentityT w) where
59+
track = lowerTrack
60+
61+
instance comonadTracedEnvT :: ComonadTraced t w => ComonadTraced t (EnvT e w) where
62+
track = lowerTrack
63+
64+
instance comonadTracedStoreT :: ComonadTraced t w => ComonadTraced t (StoreT s w) where
65+
track = lowerTrack

src/Control/Comonad/Trans/Class.purs

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
module Control.Comonad.Trans.Class where
44

55
import Control.Comonad (class Comonad)
6+
import Control.Monad.Identity.Trans (IdentityT, runIdentityT)
67

78
-- | The `ComonadTrans` type class represents _comonad transformers_.
89
-- |
@@ -21,3 +22,6 @@ import Control.Comonad (class Comonad)
2122
-- | - `lower (extend w (f <<< lower)) = extend (lower w) f`
2223
class ComonadTrans f where
2324
lower :: forall w a. Comonad w => f w a -> w a
25+
26+
instance comonadTransIdentityT :: ComonadTrans IdentityT where
27+
lower = runIdentityT

src/Control/Monad/Identity/Trans.purs

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Prelude
44

55
import Control.Alt (class Alt)
66
import Control.Alternative (class Alternative)
7+
import Control.Comonad (class Comonad, class Extend, extend, extract)
78
import Control.Monad.Cont.Class (class MonadCont)
89
import Control.Monad.Error.Class (class MonadError, class MonadThrow)
910
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader)
@@ -15,9 +16,9 @@ import Control.MonadPlus (class MonadPlus)
1516
import Control.Plus (class Plus)
1617
import Data.Eq (class Eq1)
1718
import Data.Foldable (class Foldable)
18-
import Data.Traversable (class Traversable)
1919
import Data.Newtype (class Newtype)
2020
import Data.Ord (class Ord1)
21+
import Data.Traversable (class Traversable)
2122
import Effect.Class (class MonadEffect)
2223

2324
-- | The `IdentityT` monad transformer.
@@ -67,3 +68,9 @@ derive newtype instance monadTellIdentityT :: MonadTell w m => MonadTell w (Iden
6768
derive newtype instance monadWriterIdentityT :: MonadWriter w m => MonadWriter w (IdentityT m)
6869
derive newtype instance foldableIdentityT :: Foldable m => Foldable (IdentityT m)
6970
derive newtype instance traversableIdentityT :: Traversable m => Traversable (IdentityT m)
71+
72+
instance extendIdentityI :: Extend w => Extend (IdentityT w) where
73+
extend f (IdentityT m) = IdentityT (extend (f <<< IdentityT) m)
74+
75+
instance comonadIdentityT :: Comonad w => Comonad (IdentityT w) where
76+
extract = extract <<< runIdentityT

0 commit comments

Comments
 (0)