transformers-eff 0.1.0.0 → 0.2.0.0
raw patch · 5 files changed
+56/−20 lines, 5 filesdep +list-transformerdep ~basedep ~freedep ~mmorphPVP ok
version bump matches the API change (PVP)
Dependencies added: list-transformer
Dependency ranges changed: base, free, mmorph, transformers
API changes (from Hackage documentation)
+ Control.Effect: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.Effect.Eff effect m)
+ Control.Effect.Nondeterminism: runNondeterminismM :: (Monad m, Foldable f) => (b -> a -> m b) -> m b -> Eff f m a -> m b
- Control.Effect.Nondeterminism: choose :: Nondeterministic m => [a] -> m a
+ Control.Effect.Nondeterminism: choose :: (Nondeterministic m, Foldable f) => f a -> m a
- Control.Effect.Nondeterminism: runNondeterminism :: Monad m => Eff [] m a -> m [a]
+ Control.Effect.Nondeterminism: runNondeterminism :: (Monad m, Foldable f) => (b -> a -> b) -> b -> Eff f m a -> m b
- Control.Effect.State: gets :: (Interprets (State state) m) => (state -> state) -> m state
+ Control.Effect.State: gets :: (Interprets (State state) m) => (state -> a) -> m a
Files
- ChangeLog.md +23/−0
- Control/Effect.hs +11/−0
- Control/Effect/Nondeterminism.hs +10/−13
- Control/Effect/State.hs +1/−1
- transformers-eff.cabal +11/−6
+ ChangeLog.md view
@@ -0,0 +1,23 @@+# Revision history for transformers-eff++## 0.2.0.0 -- 2017-02-07++### Breaking Changes++* The type of `gets` was changed to actually be the `gets` operation.+* `Control.Effect.Nondeterminism` now uses `list-transformer` instead of lists.+* `Control.Effect.Nondeterminism.choose` now chooses from any `Foldable` + structure.++### Non-breaking Changes++* A `MonadIO` instance was added to `Eff`.+* New function: `Control.Effect.Nondeterminism.runNondeterminismM`.++### Other changes++* The upper bound of `base` was increased.++## 0.1.0.0 -- 2017-02-02++* First version. Released on an unsuspecting world. Mwahaha.
Control/Effect.hs view
@@ -1,15 +1,22 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE TypeFamilies #-} +#if __GLASGOW_HASKELL__ >=800+{-# LANGUAGE UndecidableSuperClasses #-}+#endif+ module Control.Effect ( -- * Core API Eff(..), translate, Interprets, interpret, IsEff) where import Control.Monad+import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Morph+import Control.Monad.Trans.Class(MonadTrans(lift)) import Control.Monad.Trans.Cont (ContT(..)) import Data.Functor.Sum import GHC.Exts (Constraint)@@ -87,6 +94,10 @@ instance MonadTrans (Eff f) where lift m = Eff (\l -> l (InR m)) {-# INLINE lift #-}++instance MonadIO m => MonadIO (Eff effect m) where+ liftIO = lift . liftIO+ {-# INLINE liftIO #-} {-
Control/Effect/Nondeterminism.hs view
@@ -5,12 +5,9 @@ import Control.Monad (join) import Control.Monad.Trans.Class (lift)-import Control.Monad.Trans.Cont (shiftT) import Control.Effect-import qualified Pipes as P-import qualified Pipes.Prelude as P---- TODO Can probably generalize over any foldable.+import Data.Foldable (Foldable, toList)+import List.Transformer (fold, foldM, select) class Monad m => Nondeterministic m where liftNondeterminism :: [a] -> m a@@ -23,17 +20,17 @@ liftNondeterminism = lift . liftNondeterminism {-# INLINE liftNondeterminism #-} -choose :: Nondeterministic m => [a] -> m a-choose = liftNondeterminism+choose :: (Nondeterministic m, Foldable f) => f a -> m a+choose = liftNondeterminism . toList {-# INLINE choose #-} -runNondeterminism :: Monad m => Eff [] m a -> m [a]-runNondeterminism eff = P.toListM (P.enumerate (translate makeChoice eff))- where makeChoice choices =- shiftT (\k ->- lift (P.Select (P.for (P.each choices)- (P.enumerate . k))))+runNondeterminism :: (Monad m, Foldable f) => (b -> a -> b) -> b -> Eff f m a -> m b+runNondeterminism f z = fold f z id . translate (lift . select) {-# INLINE runNondeterminism #-}++runNondeterminismM :: (Monad m, Foldable f) => (b -> a -> m b) -> m b -> Eff f m a -> m b+runNondeterminismM f z = foldM f z return . translate (lift . select)+{-# INLINE runNondeterminismM #-} -- TODO Non-conflicting names?
Control/Effect/State.hs view
@@ -37,6 +37,6 @@ modify' f = interpret (State.modify' f) {-# INLINE modify' #-} -gets :: (Interprets (State state) m) => (state -> state) -> m state+gets :: (Interprets (State state) m) => (state -> a) -> m a gets f = interpret (State.gets f) {-# INLINE gets #-}
transformers-eff.cabal view
@@ -1,23 +1,28 @@ name: transformers-eff synopsis: An approach to managing composable effects, ala mtl/transformers/extensible-effects/Eff-version: 0.1.0.0+version: 0.2.0.0 homepage: https://github.com/ocharles/transformers-eff license: BSD3 license-file: LICENSE author: Ollie Charles maintainer: ollie@ocharles.org.uk--- copyright: +-- copyright: category: Control build-type: Simple--- extra-source-files: +extra-source-files:+ ChangeLog.md cabal-version: >=1.10 library exposed-modules: Control.Effect, Control.Effect.Environment, Control.Effect.Nondeterminism, Control.Effect.Exception, Control.Effect.IO, Control.Effect.State, Control.Effect.Identity- -- other-modules: + -- other-modules: other-extensions: TypeOperators, DeriveDataTypeable, DefaultSignatures, DeriveFunctor, StandaloneDeriving, ExistentialQuantification, FlexibleContexts, FlexibleInstances, FunctionalDependencies, KindSignatures, RankNTypes, UndecidableInstances, MultiParamTypeClasses, GeneralizedNewtypeDeriving- build-depends: base >=4.8 && <4.9, transformers >=0.4 && <0.5, pipes, free, mmorph- -- hs-source-dirs: + build-depends: base >=4.8 && <5+ , transformers >=0.4 && <0.6+ , list-transformer >= 1.0.1 && < 1.1+ , free >= 4.12.4 && < 4.13+ , mmorph >= 1.0.9 && < 1.1+ -- hs-source-dirs: default-language: Haskell2010 ghc-options: -Wall