pipes-extras 1.0.0 → 1.0.1
raw patch · 2 files changed
+40/−4 lines, 2 filesdep ~foldldep ~transformersPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: foldl, transformers
API changes (from Hackage documentation)
+ Pipes.Extras: fromProxy :: Monad m => Proxy a' a b' b m r -> (a' -> (a -> m r) -> m r) -> (b -> (b' -> m r) -> m r) -> m r
+ Pipes.Extras: toProxy :: Monad n => (forall m. Monad m => (a' -> (a -> m r) -> m r) -> (b -> (b' -> m r) -> m r) -> m r) -> Proxy a' a b' b n r
Files
- pipes-extras.cabal +4/−4
- src/Pipes/Extras.hs +36/−0
pipes-extras.cabal view
@@ -1,5 +1,5 @@ Name: pipes-extras -Version: 1.0.0 +Version: 1.0.1 Cabal-Version: >=1.10 Build-Type: Simple License: BSD3 @@ -21,8 +21,8 @@ Build-Depends: base >= 4 && < 5 , pipes >= 4.0 && < 4.2, - foldl >= 1.0.1 && < 1.1, - transformers >= 0.2.0.0 && < 0.4 + foldl >= 1.0.1 && < 1.2, + transformers >= 0.2.0.0 && < 0.5 Exposed-Modules: Pipes.Extras GHC-Options: -O2 -Wall Default-Language: Haskell2010 @@ -41,4 +41,4 @@ test-framework >= 0.4 && < 1 , test-framework-hunit >= 0.3 && < 1 , HUnit >= 1.2 && < 1.3 , - transformers >= 0.2.0.0 && < 0.4 + transformers >= 0.2.0.0 && < 0.5
src/Pipes/Extras.hs view
@@ -31,6 +31,10 @@ , scan1M , scan1i , scan1iM + + -- * Church encodings + , toProxy + , fromProxy ) where import Control.Concurrent (threadDelay) @@ -39,6 +43,7 @@ import Control.Foldl (purely, impurely, Fold, FoldM) import Pipes import Pipes.Core (request, respond, (>\\), (//>)) +import Pipes.Internal (Proxy(..)) import qualified Pipes.Prelude as Pipes -- | Like 'Control.Arrow.arr' from 'Control.Arrow.Arrow' @@ -238,3 +243,34 @@ initial <- await Pipes.scanM step (begin initial) done {-# INLINABLE scan1M #-} + +-- | Build a `Proxy` from its church encoding +toProxy + :: Monad n + => ( forall m + . Monad m + => (a' -> (a -> m r) -> m r) + -> (b -> (b' -> m r) -> m r) + -> m r + ) + -> Proxy a' a b' b n r +toProxy k = k + (\a' fa -> request a' >>= fa ) + (\b fb' -> respond b >>= fb') + +-- | Convert a `Proxy` to its church encoding +fromProxy + :: Monad m + => Proxy a' a b' b m r + -> (a' -> (a -> m r) -> m r) + -> (b -> (b' -> m r) -> m r) + -> m r +fromProxy p request' respond' = case p of + Request a' fa -> do + request' a' (\a -> fromProxy (fa a ) request' respond') + Respond b fb' -> do + respond' b (\b' -> fromProxy (fb' b') request' respond') + M m -> do + p' <- m + fromProxy p' request' respond' + Pure r -> return r