comonad-transformers 0.2.0 → 0.2.1
raw patch · 10 files changed
+429/−144 lines, 10 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Control.Comonad.Trans.Discont: DiscontT :: (w s -> a) -> (w s) -> DiscontT s w a
- Control.Comonad.Trans.Discont: callCV :: DiscontT s w (DiscontT s w (DiscontT s w a -> a) -> b) -> b
- Control.Comonad.Trans.Discont: data DiscontT s w a
- Control.Comonad.Trans.Discont: discont :: (s -> a) -> s -> Discont s a
- Control.Comonad.Trans.Discont: instance Comonad w => Comonad (DiscontT s w)
- Control.Comonad.Trans.Discont: instance ComonadTrans (DiscontT s)
- Control.Comonad.Trans.Discont: instance Functor w => Functor (DiscontT s w)
- Control.Comonad.Trans.Discont: runDiscont :: Discont s a -> (s -> a, s)
- Control.Comonad.Trans.Discont: runDiscontT :: DiscontT s w a -> (w s -> a, w s)
- Control.Comonad.Trans.Discont: type Discont s = DiscontT s Identity
- Control.Comonad.Trans.Env: EnvT :: e -> (w a) -> EnvT e w a
- Control.Comonad.Trans.Env: ask :: EnvT e w a -> e
- Control.Comonad.Trans.Env: data EnvT e w a
- Control.Comonad.Trans.Env: env :: e -> a -> Env e a
- Control.Comonad.Trans.Env: instance Comonad w => Comonad (EnvT e w)
- Control.Comonad.Trans.Env: instance ComonadHoist (EnvT e)
- Control.Comonad.Trans.Env: instance ComonadTrans (EnvT e)
- Control.Comonad.Trans.Env: instance Functor w => Functor (EnvT e w)
- Control.Comonad.Trans.Env: runEnv :: Env e a -> (e, a)
- Control.Comonad.Trans.Env: runEnvT :: EnvT e w a -> (e, w a)
- Control.Comonad.Trans.Env: type Env e = EnvT e Identity
- Control.Comonad.Trans.Store: StoreT :: (w (s -> a)) -> s -> StoreT s w a
- Control.Comonad.Trans.Store: data StoreT s w a
- Control.Comonad.Trans.Store: experiment :: (Comonad w, Functor f) => f (s -> s) -> StoreT s w a -> f a
- Control.Comonad.Trans.Store: get :: StoreT s w a -> s
- Control.Comonad.Trans.Store: instance Comonad w => Comonad (StoreT s w)
- Control.Comonad.Trans.Store: instance ComonadHoist (StoreT s)
- Control.Comonad.Trans.Store: instance ComonadTrans (StoreT s)
- Control.Comonad.Trans.Store: instance Functor w => Functor (StoreT s w)
- Control.Comonad.Trans.Store: modify :: Comonad w => (s -> s) -> StoreT s w a -> a
- Control.Comonad.Trans.Store: put :: Comonad w => s -> StoreT s w a -> a
- Control.Comonad.Trans.Store: runStore :: Store s a -> (s -> a, s)
- Control.Comonad.Trans.Store: runStoreT :: StoreT s w a -> (w (s -> a), s)
- Control.Comonad.Trans.Store: store :: (s -> a) -> s -> Store s a
- Control.Comonad.Trans.Store: type Store s = StoreT s Identity
+ Control.Comonad.Trans.Discont.Lazy: DiscontT :: (w s -> a) -> (w s) -> DiscontT s w a
+ Control.Comonad.Trans.Discont.Lazy: callCV :: DiscontT s w (DiscontT s w (DiscontT s w a -> a) -> b) -> b
+ Control.Comonad.Trans.Discont.Lazy: data DiscontT s w a
+ Control.Comonad.Trans.Discont.Lazy: discont :: (s -> a) -> s -> Discont s a
+ Control.Comonad.Trans.Discont.Lazy: instance Comonad w => Comonad (DiscontT s w)
+ Control.Comonad.Trans.Discont.Lazy: instance ComonadTrans (DiscontT s)
+ Control.Comonad.Trans.Discont.Lazy: instance Functor w => Functor (DiscontT s w)
+ Control.Comonad.Trans.Discont.Lazy: runDiscont :: Discont s a -> (s -> a, s)
+ Control.Comonad.Trans.Discont.Lazy: runDiscontT :: DiscontT s w a -> (w s -> a, w s)
+ Control.Comonad.Trans.Discont.Lazy: type Discont s = DiscontT s Identity
+ Control.Comonad.Trans.Discont.Strict: DiscontT :: (w s -> a) -> (w s) -> DiscontT s w a
+ Control.Comonad.Trans.Discont.Strict: callCV :: DiscontT s w (DiscontT s w (DiscontT s w a -> a) -> b) -> b
+ Control.Comonad.Trans.Discont.Strict: data DiscontT s w a
+ Control.Comonad.Trans.Discont.Strict: discont :: (s -> a) -> s -> Discont s a
+ Control.Comonad.Trans.Discont.Strict: instance Comonad w => Comonad (DiscontT s w)
+ Control.Comonad.Trans.Discont.Strict: instance ComonadTrans (DiscontT s)
+ Control.Comonad.Trans.Discont.Strict: instance Functor w => Functor (DiscontT s w)
+ Control.Comonad.Trans.Discont.Strict: runDiscont :: Discont s a -> (s -> a, s)
+ Control.Comonad.Trans.Discont.Strict: runDiscontT :: DiscontT s w a -> (w s -> a, w s)
+ Control.Comonad.Trans.Discont.Strict: type Discont s = DiscontT s Identity
+ Control.Comonad.Trans.Env.Lazy: ask :: EnvT e w a -> e
+ Control.Comonad.Trans.Env.Lazy: asks :: (e -> f) -> EnvT e w a -> f
+ Control.Comonad.Trans.Env.Lazy: data EnvT e w a
+ Control.Comonad.Trans.Env.Lazy: env :: e -> a -> Env e a
+ Control.Comonad.Trans.Env.Lazy: instance Comonad w => Comonad (EnvT e w)
+ Control.Comonad.Trans.Env.Lazy: instance ComonadHoist (EnvT e)
+ Control.Comonad.Trans.Env.Lazy: instance ComonadTrans (EnvT e)
+ Control.Comonad.Trans.Env.Lazy: instance Functor w => Functor (EnvT e w)
+ Control.Comonad.Trans.Env.Lazy: local :: (e -> e) -> EnvT e w a -> EnvT e w a
+ Control.Comonad.Trans.Env.Lazy: runEnv :: Env e a -> (e, a)
+ Control.Comonad.Trans.Env.Lazy: runEnvT :: EnvT e w a -> (e, w a)
+ Control.Comonad.Trans.Env.Lazy: type Env e = EnvT e Identity
+ Control.Comonad.Trans.Env.Strict: EnvT :: e -> (w a) -> EnvT e w a
+ Control.Comonad.Trans.Env.Strict: ask :: EnvT e w a -> e
+ Control.Comonad.Trans.Env.Strict: asks :: (e -> f) -> EnvT e w a -> f
+ Control.Comonad.Trans.Env.Strict: data EnvT e w a
+ Control.Comonad.Trans.Env.Strict: env :: e -> a -> Env e a
+ Control.Comonad.Trans.Env.Strict: instance Comonad w => Comonad (EnvT e w)
+ Control.Comonad.Trans.Env.Strict: instance ComonadHoist (EnvT e)
+ Control.Comonad.Trans.Env.Strict: instance ComonadTrans (EnvT e)
+ Control.Comonad.Trans.Env.Strict: instance Functor w => Functor (EnvT e w)
+ Control.Comonad.Trans.Env.Strict: local :: (e -> e) -> EnvT e w a -> EnvT e w a
+ Control.Comonad.Trans.Env.Strict: runEnv :: Env e a -> (e, a)
+ Control.Comonad.Trans.Env.Strict: runEnvT :: EnvT e w a -> (e, w a)
+ Control.Comonad.Trans.Env.Strict: type Env e = EnvT e Identity
+ Control.Comonad.Trans.Store.Lazy: StoreT :: (w (s -> a)) -> s -> StoreT s w a
+ Control.Comonad.Trans.Store.Lazy: data StoreT s w a
+ Control.Comonad.Trans.Store.Lazy: experiment :: (Comonad w, Functor f) => f (s -> s) -> StoreT s w a -> f a
+ Control.Comonad.Trans.Store.Lazy: get :: StoreT s w a -> s
+ Control.Comonad.Trans.Store.Lazy: instance Comonad w => Comonad (StoreT s w)
+ Control.Comonad.Trans.Store.Lazy: instance ComonadHoist (StoreT s)
+ Control.Comonad.Trans.Store.Lazy: instance ComonadTrans (StoreT s)
+ Control.Comonad.Trans.Store.Lazy: instance Functor w => Functor (StoreT s w)
+ Control.Comonad.Trans.Store.Lazy: modify :: Comonad w => (s -> s) -> StoreT s w a -> a
+ Control.Comonad.Trans.Store.Lazy: put :: Comonad w => s -> StoreT s w a -> a
+ Control.Comonad.Trans.Store.Lazy: runStore :: Store s a -> (s -> a, s)
+ Control.Comonad.Trans.Store.Lazy: runStoreT :: StoreT s w a -> (w (s -> a), s)
+ Control.Comonad.Trans.Store.Lazy: store :: (s -> a) -> s -> Store s a
+ Control.Comonad.Trans.Store.Lazy: type Store s = StoreT s Identity
+ Control.Comonad.Trans.Store.Strict: StoreT :: (w (s -> a)) -> s -> StoreT s w a
+ Control.Comonad.Trans.Store.Strict: data StoreT s w a
+ Control.Comonad.Trans.Store.Strict: experiment :: (Comonad w, Functor f) => f (s -> s) -> StoreT s w a -> f a
+ Control.Comonad.Trans.Store.Strict: get :: StoreT s w a -> s
+ Control.Comonad.Trans.Store.Strict: instance Comonad w => Comonad (StoreT s w)
+ Control.Comonad.Trans.Store.Strict: instance ComonadHoist (StoreT s)
+ Control.Comonad.Trans.Store.Strict: instance ComonadTrans (StoreT s)
+ Control.Comonad.Trans.Store.Strict: instance Functor w => Functor (StoreT s w)
+ Control.Comonad.Trans.Store.Strict: modify :: Comonad w => (s -> s) -> StoreT s w a -> a
+ Control.Comonad.Trans.Store.Strict: put :: Comonad w => s -> StoreT s w a -> a
+ Control.Comonad.Trans.Store.Strict: runStore :: Store s a -> (s -> a, s)
+ Control.Comonad.Trans.Store.Strict: runStoreT :: StoreT s w a -> (w (s -> a), s)
+ Control.Comonad.Trans.Store.Strict: store :: (s -> a) -> s -> Store s a
+ Control.Comonad.Trans.Store.Strict: type Store s = StoreT s Identity
Files
- Control/Comonad/Trans/Discont.hs +5/−41
- Control/Comonad/Trans/Discont/Lazy.hs +60/−0
- Control/Comonad/Trans/Discont/Strict.hs +60/−0
- Control/Comonad/Trans/Env.hs +4/−40
- Control/Comonad/Trans/Env/Lazy.hs +68/−0
- Control/Comonad/Trans/Env/Strict.hs +68/−0
- Control/Comonad/Trans/Store.hs +7/−62
- Control/Comonad/Trans/Store/Lazy.hs +75/−0
- Control/Comonad/Trans/Store/Strict.hs +75/−0
- comonad-transformers.cabal +7/−1
Control/Comonad/Trans/Discont.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE RankNTypes #-} ----------------------------------------------------------------------------- -- | -- Module : Control.Comonad.Trans.Discont@@ -8,49 +7,14 @@ -- Maintainer : Edward Kmett <ekmett@gmail.com> -- Stability : provisional -- Portability : portable--- --- Discont is the Density comonad of a constant functor, just as Cont is a --- Codensity monad of a constant functor. ----- Note that Discont and Context are isomorphic, but DiscontT and ContextT are--- not.+-- The discontinuation comonad transformer.+-- This version is lazy; for a strict version, see+-- "Control.Comonad.Trans.Discont.Strict", which has the same interface. -- ---------------------------------------------------------------------------- module Control.Comonad.Trans.Discont- ( Discont- , discont- , runDiscont- , DiscontT(..)- , runDiscontT- , callCV+ ( module Control.Comonad.Trans.Discont.Lazy ) where -import Data.Functor.Identity-import Control.Comonad-import Control.Comonad.Trans.Class--type Discont s = DiscontT s Identity--data DiscontT s w a = DiscontT (w s -> a) (w s)--discont :: (s -> a) -> s -> Discont s a -discont f s = DiscontT (f . runIdentity) (Identity s)--runDiscont :: Discont s a -> (s -> a, s) -runDiscont (DiscontT f (Identity s)) = (f . Identity, s)--runDiscontT :: DiscontT s w a -> (w s -> a, w s)-runDiscontT (DiscontT f s) = (f, s)--instance Functor w => Functor (DiscontT s w) where- fmap g (DiscontT f ws) = DiscontT (g . f) ws--instance Comonad w => Comonad (DiscontT s w) where- extract (DiscontT f ws) = f ws- duplicate (DiscontT f ws) = DiscontT (DiscontT f) ws--instance ComonadTrans (DiscontT s) where- lower (DiscontT f s) = extend f s--callCV :: DiscontT s w (DiscontT s w (DiscontT s w a -> a) -> b) -> b-callCV (DiscontT k s) = k s (DiscontT (\s' (DiscontT k' _) -> k' s') s)+import Control.Comonad.Trans.Discont.Lazy
+ Control/Comonad/Trans/Discont/Lazy.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE RankNTypes #-}+-----------------------------------------------------------------------------+-- |+-- Module : Control.Comonad.Trans.Discont.Lazy+-- Copyright : (C) 2008-2011 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : Edward Kmett <ekmett@gmail.com>+-- Stability : provisional+-- Portability : portable+-- +-- Discont is the Density comonad of a constant functor, just as Cont is a +-- Codensity monad of a constant functor.+--+-- Note that Discont and Context are isomorphic, but DiscontT and ContextT are+-- not.+--+----------------------------------------------------------------------------+module Control.Comonad.Trans.Discont.Lazy+ ( + -- * The 'discontinuation' comonad+ Discont+ , discont+ -- * The discontinuation comonad transformer+ , runDiscont+ , DiscontT(..)+ , runDiscontT+ -- * Combinators+ , callCV+ ) where++import Data.Functor.Identity+import Control.Comonad+import Control.Comonad.Trans.Class++type Discont s = DiscontT s Identity++data DiscontT s w a = DiscontT (w s -> a) (w s)++discont :: (s -> a) -> s -> Discont s a +discont f s = DiscontT (f . runIdentity) (Identity s)++runDiscont :: Discont s a -> (s -> a, s) +runDiscont ~(DiscontT f (Identity s)) = (f . Identity, s)++runDiscontT :: DiscontT s w a -> (w s -> a, w s)+runDiscontT ~(DiscontT f s) = (f, s)++instance Functor w => Functor (DiscontT s w) where+ fmap g ~(DiscontT f ws) = DiscontT (g . f) ws++instance Comonad w => Comonad (DiscontT s w) where+ extract ~(DiscontT f ws) = f ws+ duplicate ~(DiscontT f ws) = DiscontT (DiscontT f) ws++instance ComonadTrans (DiscontT s) where+ lower ~(DiscontT f s) = extend f s++callCV :: DiscontT s w (DiscontT s w (DiscontT s w a -> a) -> b) -> b+callCV ~(DiscontT k s) = k s (DiscontT (\s' ~(DiscontT k' _) -> k' s') s)
+ Control/Comonad/Trans/Discont/Strict.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE RankNTypes #-}+-----------------------------------------------------------------------------+-- |+-- Module : Control.Comonad.Trans.Discont.Strict+-- Copyright : (C) 2008-2011 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : Edward Kmett <ekmett@gmail.com>+-- Stability : provisional+-- Portability : portable+-- +-- Discont is the Density comonad of a constant functor, just as Cont is a +-- Codensity monad of a constant functor.+--+-- Note that Discont and Context are isomorphic, but DiscontT and ContextT are+-- not.+--+----------------------------------------------------------------------------+module Control.Comonad.Trans.Discont.Strict+ ( + -- * The 'discontinuation' comonad+ Discont+ , discont+ -- * The discontinuation comonad transformer+ , runDiscont+ , DiscontT(..)+ , runDiscontT+ -- * Combinators+ , callCV+ ) where++import Data.Functor.Identity+import Control.Comonad+import Control.Comonad.Trans.Class++type Discont s = DiscontT s Identity++data DiscontT s w a = DiscontT (w s -> a) (w s)++discont :: (s -> a) -> s -> Discont s a +discont f s = DiscontT (f . runIdentity) (Identity s)++runDiscont :: Discont s a -> (s -> a, s) +runDiscont (DiscontT f (Identity s)) = (f . Identity, s)++runDiscontT :: DiscontT s w a -> (w s -> a, w s)+runDiscontT (DiscontT f s) = (f, s)++instance Functor w => Functor (DiscontT s w) where+ fmap g (DiscontT f ws) = DiscontT (g . f) ws++instance Comonad w => Comonad (DiscontT s w) where+ extract (DiscontT f ws) = f ws+ duplicate (DiscontT f ws) = DiscontT (DiscontT f) ws++instance ComonadTrans (DiscontT s) where+ lower (DiscontT f s) = extend f s++callCV :: DiscontT s w (DiscontT s w (DiscontT s w a -> a) -> b) -> b+callCV (DiscontT k s) = k s (DiscontT (\s' (DiscontT k' _) -> k' s') s)
Control/Comonad/Trans/Env.hs view
@@ -9,48 +9,12 @@ -- Portability : portable -- -- The environment comonad transformer (aka coreader).--- This adds an extra value that can be accessed in the environment.+-- This version is lazy; for a strict version, see+-- "Control.Comonad.Trans.Env.Strict", which has the same interface. ----- Left adjoint to the reader comonad. ---------------------------------------------------------------------------- module Control.Comonad.Trans.Env- ( Env- , env- , runEnv- , EnvT(..)- , runEnvT- , ask+ ( module Control.Comonad.Trans.Env.Lazy ) where -import Control.Comonad-import Control.Comonad.Trans.Class-import Control.Comonad.Hoist.Class-import Data.Functor.Identity--type Env e = EnvT e Identity-data EnvT e w a = EnvT e (w a)--env :: e -> a -> Env e a-env e a = EnvT e (Identity a)--runEnv :: Env e a -> (e, a)-runEnv (EnvT e (Identity a)) = (e, a)--runEnvT :: EnvT e w a -> (e, w a)-runEnvT (EnvT e wa) = (e, wa)--instance Functor w => Functor (EnvT e w) where- fmap g (EnvT e wa) = EnvT e (fmap g wa)--instance Comonad w => Comonad (EnvT e w) where- extract (EnvT _ wa) = extract wa- duplicate p@(EnvT e wa) = EnvT e (p <$ wa)--instance ComonadTrans (EnvT e) where- lower (EnvT _ wa) = wa--instance ComonadHoist (EnvT e) where- cohoist (EnvT e wa) = EnvT e (Identity (extract wa))--ask :: EnvT e w a -> e-ask (EnvT e _) = e+import Control.Comonad.Trans.Env.Lazy
+ Control/Comonad/Trans/Env/Lazy.hs view
@@ -0,0 +1,68 @@+-----------------------------------------------------------------------------+-- |+-- Module : Control.Comonad.Trans.Context+-- Copyright : (C) 2008-2011 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : Edward Kmett <ekmett@gmail.com>+-- Stability : provisional+-- Portability : portable+--+-- The environment comonad transformer (aka coreader).+-- This adds an extra value that can be accessed in the environment.+--+-- Left adjoint to the reader comonad.+----------------------------------------------------------------------------+module Control.Comonad.Trans.Env.Lazy+ ( + -- * The environment comonad+ Env+ , env+ , runEnv+ -- * The environment comonad transformer+ , EnvT+ , runEnvT+ -- * Combinators+ , ask+ , asks+ , local+ ) where++import Control.Comonad+import Control.Comonad.Trans.Class+import Control.Comonad.Hoist.Class+import Data.Functor.Identity++type Env e = EnvT e Identity+data EnvT e w a = EnvT e (w a)++env :: e -> a -> Env e a+env e a = EnvT e (Identity a)++runEnv :: Env e a -> (e, a)+runEnv ~(EnvT e (Identity a)) = (e, a)++runEnvT :: EnvT e w a -> (e, w a)+runEnvT ~(EnvT e wa) = (e, wa)++instance Functor w => Functor (EnvT e w) where+ fmap g ~(EnvT e wa) = EnvT e (fmap g wa)++instance Comonad w => Comonad (EnvT e w) where+ extract ~(EnvT _ wa) = extract wa+ duplicate p@(~(EnvT e wa)) = EnvT e (p <$ wa)++instance ComonadTrans (EnvT e) where+ lower ~(EnvT _ wa) = wa++instance ComonadHoist (EnvT e) where+ cohoist ~(EnvT e wa) = EnvT e (Identity (extract wa))++ask :: EnvT e w a -> e+ask ~(EnvT e _) = e++asks :: (e -> f) -> EnvT e w a -> f+asks f = f . ask++local :: (e -> e) -> EnvT e w a -> EnvT e w a+local f ~(EnvT e wa) = EnvT (f e) wa
+ Control/Comonad/Trans/Env/Strict.hs view
@@ -0,0 +1,68 @@+-----------------------------------------------------------------------------+-- |+-- Module : Control.Comonad.Trans.Env.Strict+-- Copyright : (C) 2008-2011 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : Edward Kmett <ekmett@gmail.com>+-- Stability : provisional+-- Portability : portable+--+-- The environment comonad transformer (aka coreader).+-- This adds an extra value that can be accessed in the environment.+--+-- Left adjoint to the reader comonad.+----------------------------------------------------------------------------+module Control.Comonad.Trans.Env.Strict+ ( + -- * The strict environment comonad+ Env+ , env+ , runEnv+ -- * The strict environment comonad transformer+ , EnvT(..)+ , runEnvT+ -- * Combinators+ , ask+ , asks+ , local+ ) where++import Control.Comonad+import Control.Comonad.Trans.Class+import Control.Comonad.Hoist.Class+import Data.Functor.Identity++type Env e = EnvT e Identity+data EnvT e w a = EnvT e (w a)++env :: e -> a -> Env e a+env e a = EnvT e (Identity a)++runEnv :: Env e a -> (e, a)+runEnv (EnvT e (Identity a)) = (e, a)++runEnvT :: EnvT e w a -> (e, w a)+runEnvT (EnvT e wa) = (e, wa)++instance Functor w => Functor (EnvT e w) where+ fmap g (EnvT e wa) = EnvT e (fmap g wa)++instance Comonad w => Comonad (EnvT e w) where+ extract (EnvT _ wa) = extract wa+ duplicate p@(EnvT e wa) = EnvT e (p <$ wa)++instance ComonadTrans (EnvT e) where+ lower (EnvT _ wa) = wa++instance ComonadHoist (EnvT e) where+ cohoist (EnvT e wa) = EnvT e (Identity (extract wa))++ask :: EnvT e w a -> e+ask (EnvT e _) = e++asks :: (e -> f) -> EnvT e w a -> f+asks f (EnvT e _) = f e++local :: (e -> e) -> EnvT e w a -> EnvT e w a+local f (EnvT e wa) = EnvT (f e) wa
Control/Comonad/Trans/Store.hs view
@@ -1,6 +1,6 @@ ----------------------------------------------------------------------------- -- |--- Module : Control.Comonad.Trans.Store+-- Module : Control.Comonad.Trans.Context -- Copyright : (C) 2008-2011 Edward Kmett -- License : BSD-style (see the file LICENSE) --@@ -8,68 +8,13 @@ -- Stability : provisional -- Portability : portable ----- The store (state-in-context/costate) comonad transformer is subject to the laws:--- --- > x = put (get x) x--- > y = get (put y x)--- > put y x = put y (put z x)+-- The store comonad transformer (aka costate).+-- This version is lazy; for a strict version, see+-- "Control.Comonad.Trans.Store.Strict", which has the same interface. ----- Thanks go to Russell O'Connor and Daniel Peebles for their help formulating --- and proving the laws for this comonad transformer. -----------------------------------------------------------------------------module Control.Comonad.Trans.Store - ( - -- * The Store comonad- Store, store, runStore- -- * The Store comonad transformer- , StoreT(..), runStoreT- -- * Operations- , get- , put- , modify- , experiment+module Control.Comonad.Trans.Store+ ( module Control.Comonad.Trans.Store.Lazy ) where -import Control.Comonad-import Control.Comonad.Hoist.Class-import Control.Comonad.Trans.Class-import Data.Functor.Identity--type Store s = StoreT s Identity--store :: (s -> a) -> s -> Store s a -store f s = StoreT (Identity f) s--runStore :: Store s a -> (s -> a, s)-runStore (StoreT (Identity f) s) = (f, s)--data StoreT s w a = StoreT (w (s -> a)) s--runStoreT :: StoreT s w a -> (w (s -> a), s)-runStoreT (StoreT wf s) = (wf, s)--instance Functor w => Functor (StoreT s w) where- fmap f (StoreT wf s) = StoreT (fmap (f .) wf) s--instance Comonad w => Comonad (StoreT s w) where- extract (StoreT wf s) = extract wf s- duplicate (StoreT wf s) = StoreT (extend StoreT wf) s- extend f (StoreT wf s) = StoreT (extend (\wf' s' -> f (StoreT wf' s')) wf) s--instance ComonadTrans (StoreT s) where- lower (StoreT f s) = fmap ($s) f--instance ComonadHoist (StoreT s) where- cohoist (StoreT f s) = StoreT (Identity (extract f)) s--get :: StoreT s w a -> s-get (StoreT _ s) = s--put :: Comonad w => s -> StoreT s w a -> a -put s (StoreT f _) = extract f s--modify :: Comonad w => (s -> s) -> StoreT s w a -> a-modify f (StoreT g s) = extract g (f s)--experiment :: (Comonad w, Functor f) => f (s -> s) -> StoreT s w a -> f a-experiment fs (StoreT g s) = fmap (\f -> extract g (f s)) fs+import Control.Comonad.Trans.Store.Lazy
+ Control/Comonad/Trans/Store/Lazy.hs view
@@ -0,0 +1,75 @@+-----------------------------------------------------------------------------+-- |+-- Module : Control.Comonad.Trans.Store.Lazy+-- Copyright : (C) 2008-2011 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : Edward Kmett <ekmett@gmail.com>+-- Stability : provisional+-- Portability : portable+--+-- The lazy store (state-in-context/costate) comonad transformer is subject to the laws:+-- +-- > x = put (get x) x+-- > y = get (put y x)+-- > put y x = put y (put z x)+--+-- Thanks go to Russell O'Connor and Daniel Peebles for their help formulating +-- and proving the laws for this comonad transformer.+----------------------------------------------------------------------------+module Control.Comonad.Trans.Store.Lazy+ ( + -- * The Store comonad+ Store, store, runStore+ -- * The Store comonad transformer+ , StoreT(..), runStoreT+ -- * Operations+ , get+ , put+ , modify+ , experiment+ ) where++import Control.Comonad+import Control.Comonad.Hoist.Class+import Control.Comonad.Trans.Class+import Data.Functor.Identity++type Store s = StoreT s Identity++store :: (s -> a) -> s -> Store s a +store f s = StoreT (Identity f) s++runStore :: Store s a -> (s -> a, s)+runStore ~(StoreT (Identity f) s) = (f, s)++data StoreT s w a = StoreT (w (s -> a)) s++runStoreT :: StoreT s w a -> (w (s -> a), s)+runStoreT ~(StoreT wf s) = (wf, s)++instance Functor w => Functor (StoreT s w) where+ fmap f ~(StoreT wf s) = StoreT (fmap (f .) wf) s++instance Comonad w => Comonad (StoreT s w) where+ extract ~(StoreT wf s) = extract wf s+ duplicate ~(StoreT wf s) = StoreT (extend StoreT wf) s+ extend f ~(StoreT wf s) = StoreT (extend (\wf' s' -> f (StoreT wf' s')) wf) s++instance ComonadTrans (StoreT s) where+ lower ~(StoreT f s) = fmap ($s) f++instance ComonadHoist (StoreT s) where+ cohoist ~(StoreT f s) = StoreT (Identity (extract f)) s++get :: StoreT s w a -> s+get ~(StoreT _ s) = s++put :: Comonad w => s -> StoreT s w a -> a +put s ~(StoreT f _) = extract f s++modify :: Comonad w => (s -> s) -> StoreT s w a -> a+modify f ~(StoreT g s) = extract g (f s)++experiment :: (Comonad w, Functor f) => f (s -> s) -> StoreT s w a -> f a+experiment fs ~(StoreT g s) = fmap (\f -> extract g (f s)) fs
+ Control/Comonad/Trans/Store/Strict.hs view
@@ -0,0 +1,75 @@+-----------------------------------------------------------------------------+-- |+-- Module : Control.Comonad.Trans.Store.Strict+-- Copyright : (C) 2008-2011 Edward Kmett+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : Edward Kmett <ekmett@gmail.com>+-- Stability : provisional+-- Portability : portable+--+-- The strict store (state-in-context/costate) comonad transformer is subject to the laws:+-- +-- > x = put (get x) x+-- > y = get (put y x)+-- > put y x = put y (put z x)+--+-- Thanks go to Russell O'Connor and Daniel Peebles for their help formulating +-- and proving the laws for this comonad transformer.+----------------------------------------------------------------------------+module Control.Comonad.Trans.Store.Strict+ ( + -- * The Store comonad+ Store, store, runStore+ -- * The Store comonad transformer+ , StoreT(..), runStoreT+ -- * Operations+ , get+ , put+ , modify+ , experiment+ ) where++import Control.Comonad+import Control.Comonad.Hoist.Class+import Control.Comonad.Trans.Class+import Data.Functor.Identity++type Store s = StoreT s Identity++store :: (s -> a) -> s -> Store s a +store f s = StoreT (Identity f) s++runStore :: Store s a -> (s -> a, s)+runStore (StoreT (Identity f) s) = (f, s)++data StoreT s w a = StoreT (w (s -> a)) s++runStoreT :: StoreT s w a -> (w (s -> a), s)+runStoreT (StoreT wf s) = (wf, s)++instance Functor w => Functor (StoreT s w) where+ fmap f (StoreT wf s) = StoreT (fmap (f .) wf) s++instance Comonad w => Comonad (StoreT s w) where+ extract (StoreT wf s) = extract wf s+ duplicate (StoreT wf s) = StoreT (extend StoreT wf) s+ extend f (StoreT wf s) = StoreT (extend (\wf' s' -> f (StoreT wf' s')) wf) s++instance ComonadTrans (StoreT s) where+ lower (StoreT f s) = fmap ($s) f++instance ComonadHoist (StoreT s) where+ cohoist (StoreT f s) = StoreT (Identity (extract f)) s++get :: StoreT s w a -> s+get (StoreT _ s) = s++put :: Comonad w => s -> StoreT s w a -> a +put s (StoreT f _) = extract f s++modify :: Comonad w => (s -> s) -> StoreT s w a -> a+modify f (StoreT g s) = extract g (f s)++experiment :: (Comonad w, Functor f) => f (s -> s) -> StoreT s w a -> f a+experiment fs (StoreT g s) = fmap (\f -> extract g (f s)) fs
comonad-transformers.cabal view
@@ -1,6 +1,6 @@ name: comonad-transformers category: Control, Comonads-version: 0.2.0+version: 0.2.1 license: BSD3 cabal-version: >= 1.2 license-file: LICENSE@@ -25,9 +25,15 @@ Control.Comonad.Hoist.Class Control.Comonad.Trans.Class Control.Comonad.Trans.Discont+ Control.Comonad.Trans.Discont.Lazy+ Control.Comonad.Trans.Discont.Strict Control.Comonad.Trans.Env+ Control.Comonad.Trans.Env.Lazy+ Control.Comonad.Trans.Env.Strict Control.Comonad.Trans.Identity Control.Comonad.Trans.Store+ Control.Comonad.Trans.Store.Lazy+ Control.Comonad.Trans.Store.Strict Control.Comonad.Trans.Traced Control.Comonad.Trans.Stream