0 | module Control.Comonad.Env.Env
2 | import Control.Comonad
3 | import Control.Comonad.Trans
4 | import Control.Monad.Identity
9 | record EnvT (e : Type) (w : Type -> Type) (a : Type) where
15 | Env : (e : Type) -> (a : Type) -> Type
16 | Env e = EnvT e Identity
20 | mkEnv : e -> a -> Env e a
21 | mkEnv e a = MkEnvT e (Id a)
24 | runEnv : Env e a -> (e, a)
25 | runEnv (MkEnvT e (Id a)) = (e, a)
28 | runEnvT : EnvT e w a -> (e, w a)
29 | runEnvT (MkEnvT e wa) = (e, wa)
33 | local : (e -> e') -> EnvT e w a -> EnvT e' w a
34 | local f = { env $= f}
41 | Functor w => Functor (EnvT e w) where
42 | map g (MkEnvT e wa) = MkEnvT e (map g wa)
45 | (Monoid e, Applicative m) => Applicative (EnvT e m) where
46 | pure = MkEnvT neutral . pure
47 | MkEnvT ef wf <*> MkEnvT ea wa = MkEnvT (ef <+> ea) (wf <*> wa)
50 | Foldable w => Foldable (EnvT e w) where
51 | foldl f acc = foldl f acc . val
52 | foldr f acc = foldr f acc . val
56 | Traversable w => Traversable (EnvT e w) where
57 | traverse f (MkEnvT e w) = MkEnvT e <$> traverse f w
60 | Comonad w => Comonad (EnvT e w) where
61 | duplicate (MkEnvT e wa) = MkEnvT e (extend (MkEnvT e) wa)
62 | extract = extract . val
65 | ComonadTrans (EnvT e) where
66 | lower (MkEnvT _ wa) = wa
69 | (Semigroup e, ComonadApply w) => ComonadApply (EnvT e w) where
70 | MkEnvT ef wf <@> MkEnvT ea wa = MkEnvT (ef <+> ea) (wf <@> wa)