0 | module Control.Comonad.Env.Interface
 1 |
 2 | import Control.Comonad
 3 | import Control.Comonad.Env.Env
 4 | import Control.Comonad.Store.Store
 5 | import Control.Comonad.Traced.Traced
 6 | import Control.Comonad.Trans
 7 |
 8 | %default total
 9 |
10 | public export
11 | interface Comonad w => ComonadEnv e w | w where
12 |   ask : w a -> e
13 |
14 | public export %inline
15 | asks : ComonadEnv e w => (e -> e') -> w a -> e'
16 | asks = (. ask)
17 |
18 | public export %inline
19 | lowerAsk : (ComonadEnv e w, ComonadTrans t) => t w a -> e
20 | lowerAsk = ask . lower
21 |
22 | --------------------------------------------------------------------------------
23 | --          Implementations
24 | --------------------------------------------------------------------------------
25 |
26 | public export %inline
27 | Comonad w => ComonadEnv e (EnvT e w) where
28 |   ask = env
29 |
30 | public export %inline
31 | ComonadEnv e w => ComonadEnv e (StoreT t w) where
32 |   ask = lowerAsk {t = StoreT t}
33 |
34 | public export %inline
35 | (ComonadEnv e w, Monoid m) => ComonadEnv e (TracedT m w) where
36 |   ask = lowerAsk {t = TracedT m}
37 |