composition-prelude 1.5.1.0 → 1.5.2.0
raw patch · 3 files changed
+81/−10 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Control.Composition: (<-=**<) :: Monad m => (c -> m d) -> (a -> b -> d -> m e) -> a -> b -> c -> m e
+ Control.Composition: (<-=*<) :: Monad m => (b -> m c) -> (a -> c -> m d) -> a -> b -> m d
+ Control.Composition: (<=**<) :: Monad m => (d -> m e) -> (a -> b -> c -> m d) -> a -> b -> c -> m e
+ Control.Composition: (<=*<) :: Monad m => (c -> m d) -> (a -> b -> m c) -> a -> b -> m d
+ Control.Composition: (<=<) :: Monad m => b -> m c -> a -> m b -> a -> m c
+ Control.Composition: (>-=**>) :: Monad m => (a -> b -> d -> m e) -> (c -> m d) -> a -> b -> c -> m e
+ Control.Composition: (>-=*>) :: Monad m => (a -> c -> m d) -> (b -> m c) -> a -> b -> m d
+ Control.Composition: (>=**>) :: Monad m => (a -> b -> c -> m d) -> (d -> m e) -> a -> b -> c -> m e
+ Control.Composition: (>=*>) :: Monad m => (a -> b -> m c) -> (c -> m d) -> a -> b -> m d
+ Control.Composition: (>=>) :: Monad m => a -> m b -> b -> m c -> a -> m c
+ Control.Composition: infixr 1 >=>
Files
- CHANGELOG.md +11/−0
- composition-prelude.cabal +2/−1
- src/Control/Composition.hs +68/−9
+ CHANGELOG.md view
@@ -0,0 +1,11 @@+# composition-prelude++# 1.5.2.0++ * Add monadic versions of various composition operators.+ * Performance improvements related to the inliner++# 1.5.1.0++ * Add `threadM`+ * Generalize `thread` to work on any `Foldable` of functions
composition-prelude.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.18 name: composition-prelude-version: 1.5.1.0+version: 1.5.2.0 license: BSD3 license-file: LICENSE copyright: Copyright: (c) 2017-2018 Vanessa McHale@@ -14,6 +14,7 @@ category: Control, Data build-type: Simple extra-doc-files: README.md+ CHANGELOG.md source-repository head type: darcs
src/Control/Composition.hs view
@@ -10,6 +10,19 @@ , (-.**) , (-.***) , (-.****)+ -- * Monadic composition+ , (<=<)+ , (>=>)+ -- * Monadic postcomposition+ , (<=*<)+ , (<=**<)+ , (>=**>)+ , (>=*>)+ -- * Monadic precomposition+ , (<-=*<)+ , (>-=*>)+ , (<-=**<)+ , (>-=**>) -- * Fancy function application , (-$) -- * Monadic helpers@@ -59,36 +72,82 @@ -- | Backwards function application (-$) :: (a -> b -> c) -> b -> a -> c-(-$) f x y = f y x+(-$) = flip -- | As an example: -- -- > λ:> ((*2) .* (+)) 1 3 4 -- > 16 (.*) :: (c -> d) -> (a -> b -> c) -> a -> b -> d-(.*) f g x y = f (g x y)+(.*) f g = \x y -> f (g x y) -- FIXME use lambda approach for better inlining? Like (.) does (.**) :: (d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> e-(.**) f g x y z = f (g x y z)+(.**) f g = \x y z -> f (g x y z) (.***) :: (e -> f) -> (a -> b -> c -> d -> e) -> a -> b -> c -> d -> f-(.***) f g w x y z = f (g w x y z)+(.***) f g = \w x y z -> f (g w x y z) (.****) :: (f -> g) -> (a -> b -> c -> d -> e -> f) -> a -> b -> c -> d -> e -> g-(.****) f g v w x y z = f (g v w x y z)+(.****) f g = \v w x y z -> f (g v w x y z) +-- | A monadic version of '.*'. Compare '<=<'.+--+-- As an example, one could use this to rewrite+--+-- > \x y z -> f (g x y z) z+--+-- to+--+-- > f <=*< g+--+-- @since 1.5.2.0+(<=*<) :: Monad m => (c -> m d) -> (a -> b -> m c) -> a -> b -> m d+(<=*<) f g = \x y -> f =<< g x y++-- | The bleeding fish operator+--+-- @since 1.5.2.0+(<=**<) :: Monad m => (d -> m e) -> (a -> b -> c -> m d) -> a -> b -> c -> m e+(<=**<) f g = \x y z -> f =<< g x y z++-- | Compare '>=>'.+--+-- @since 1.5.2.0+(>=*>) :: Monad m => (a -> b -> m c) -> (c -> m d) -> a -> b -> m d+(>=*>) g f = \x y -> f =<< g x y++-- | @since 1.5.2.0+(>=**>) :: Monad m => (a -> b -> c -> m d) -> (d -> m e) -> a -> b -> c -> m e+(>=**>) g f = \x y z -> f =<< g x y z++-- | @since 1.5.2.0+(<-=*<) :: Monad m => (b -> m c) -> (a -> c -> m d) -> a -> b -> m d+(<-=*<) f g = \x y -> g x =<< f y++-- | @since 1.5.2.0+(>-=*>) :: Monad m => (a -> c -> m d) -> (b -> m c) -> a -> b -> m d+(>-=*>) g f = \x y -> g x =<< f y++-- | @since 1.5.2.0+(<-=**<) :: Monad m => (c -> m d) -> (a -> b -> d -> m e) -> a -> b -> c -> m e+(<-=**<) f g = \x y z -> g x y =<< f z++-- | @since 1.5.2.0+(>-=**>) :: Monad m => (a -> b -> d -> m e) -> (c -> m d) -> a -> b -> c -> m e+(>-=**>) g f = \x y z -> g x y =<< f z+ -- | The Oedipus combinator (-.*) :: (b -> c) -> (a -> c -> d) -> a -> b -> d-(-.*) f g x y = g x (f y)+(-.*) f g = \x y -> g x (f y) (-.**) :: (c -> d) -> (a -> b -> d -> e) -> a -> b -> c -> e-(-.**) f g x y z = g x y (f z)+(-.**) f g = \x y z -> g x y (f z) (-.***) :: (d -> e) -> (a -> b -> c -> e -> f) -> a -> b -> c -> d -> f-(-.***) f g w x y z = g w x y (f z)+(-.***) f g = \w x y z -> g w x y (f z) (-.****) :: (e -> f) -> (a -> b -> c -> d -> f -> g) -> a -> b -> c -> d -> e -> g-(-.****) f g v w x y z = g v w x y (f z)+(-.****) f g = \v w x y z -> g v w x y (f z) -- | Backwards function composition. This is a specialization of '<&>'. (-.) :: (a -> b) -> (b -> c) -> a -> c