groot-0.0.1.0: src/Groot/Data/Conduit/STM.hs
module Groot.Data.Conduit.STM where
import Control.Concurrent.STM
import Control.Monad.IO.Class
import Data.Conduit
-- | Creates a Conduit Source from an async channel
chanSource :: MonadIO m
=> chan
-> (chan -> STM (Maybe a))
-> (chan -> IO ())
-> Source m a
chanSource ch reader closer = loop
where loop = do
a <- liftIO . atomically $ reader ch
case a of
Just x -> yieldOr x close >> loop
Nothing -> return ()
close = liftIO $ closer ch