0 | module Control.Comonad.Store.Store
2 | import Control.Comonad
3 | import Control.Comonad.Trans
4 | import Control.Monad.Identity
9 | record StoreT (s : Type) (w : Type -> Type) (a : Type) where
10 | constructor MkStoreT
15 | Store : (s : Type) -> (a : Type) -> Type
16 | Store s = StoreT s Identity
20 | store : (s -> a) -> s -> Store s a
21 | store f s = MkStoreT (Id f) s
24 | runStore : Store s a -> (s -> a, s)
25 | runStore (MkStoreT (Id f) s) = (f, s)
28 | runStoreT : StoreT s w a -> (w (s -> a), s)
29 | runStoreT (MkStoreT wf s) = (wf, s)
36 | Functor w => Functor (StoreT s w) where
37 | map f = { run $= map (f .) }
39 | appEnv : (s -> a -> b) -> (s -> a) -> s -> b
40 | appEnv ff fa s = ff s (fa s)
43 | (Monoid s, Applicative w) => Applicative (StoreT s w) where
44 | pure a = MkStoreT (pure $
const a) neutral
45 | MkStoreT f m <*> MkStoreT a n = MkStoreT [| appEnv f a |] (m <+> n)
48 | Comonad w => Comonad (StoreT s w) where
49 | extract (MkStoreT wf s) = extract wf s
50 | duplicate (MkStoreT wf s) = MkStoreT (extend MkStoreT wf) s
51 | extend f (MkStoreT wf s) =
52 | MkStoreT (extend (\wf',s' => f (MkStoreT wf' s')) wf) s
55 | ComonadTrans (StoreT s) where
56 | lower (MkStoreT f s) = map ($
s) f
59 | (ComonadApply w, Semigroup s) => ComonadApply (StoreT s w) where
60 | MkStoreT f m <@> MkStoreT a n = MkStoreT (map appEnv f <@> a) (m <+> n)