potoki-core-2.3.4.1: library/Potoki/Core/IO.hs
module Potoki.Core.IO (
produceAndConsume,
produceAndTransformAndConsume,
produce,
consume,
transformList,
) where
import Potoki.Core.Prelude
import Potoki.Core.Types
import qualified Potoki.Core.Produce as A
import qualified Potoki.Core.Consume as B
import qualified Acquire.IO as C
produceAndConsume :: Produce input -> Consume input output -> IO output
produceAndConsume (Produce produceAcquire) (Consume consumeIO) =
C.acquire produceAcquire consumeIO
produceAndTransformAndConsume :: Produce input -> Transform input anotherInput -> Consume anotherInput output -> IO output
produceAndTransformAndConsume (Produce produceAcquire) (Transform transformAcquire) (Consume consumeIO) =
C.acquire (produceAcquire >>= transformAcquire) consumeIO
produce :: Produce input -> forall x. IO x -> (input -> IO x) -> IO x
produce (Produce produceAcquire) stop emit =
C.acquire produceAcquire $ \ (Fetch fetchIO) -> let
loop = do
fetch <- fetchIO
case fetch of
Nothing -> stop
Just element -> emit element >> loop
in loop
consume :: IO (Maybe input) -> Consume input output -> IO output
consume fetchIO (Consume consumeIO) =
consumeIO $ Fetch fetchIO
transformList :: Transform a b -> [a] -> IO [b]
transformList transform inputList =
produceAndTransformAndConsume
(A.list inputList)
transform
(B.list)