{-# LANGUAGE ScopedTypeVariables #-}
module Shpadoinkle.Streaming
( consumeStream
) where
import Shpadoinkle hiding (h)
import Data.Functor.Of (Of ((:>)))
import Streaming (Stream)
import Streaming.Internal (destroy)
consumeStream :: forall m a b. Monad m => Stream (Of a) m () -> (a -> m (b -> b)) -> Continuation m b
consumeStream stream f = destroy stream g h j
where
g :: Of a (Continuation m b) -> Continuation m b
g (a :> k) = voidRunContinuationT $ do
commit (impur (f a))
commit (merge k)
h :: m (Continuation m b) -> Continuation m b
h = causedBy
j :: () -> Continuation m b
j = const done