packages feed

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