packages feed

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 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