module OM.Legion.Conduit (
chanToSource,
chanToSink,
) where
import Control.Concurrent.Chan (Chan, readChan, writeChan)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.Conduit (ConduitT, awaitForever, yield)
chanToSource :: (MonadIO m) => Chan a -> ConduitT void a m ()
chanToSource :: forall (m :: * -> *) a void.
MonadIO m =>
Chan a -> ConduitT void a m ()
chanToSource Chan a
chan = do
a -> ConduitT void a m ()
forall (m :: * -> *) o i. Monad m => o -> ConduitT i o m ()
yield (a -> ConduitT void a m ())
-> ConduitT void a m a -> ConduitT void a m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO a -> ConduitT void a m a
forall a. IO a -> ConduitT void a m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Chan a -> IO a
forall a. Chan a -> IO a
readChan Chan a
chan)
Chan a -> ConduitT void a m ()
forall (m :: * -> *) a void.
MonadIO m =>
Chan a -> ConduitT void a m ()
chanToSource Chan a
chan
chanToSink :: (MonadIO m) => Chan a -> ConduitT a void m ()
chanToSink :: forall (m :: * -> *) a void.
MonadIO m =>
Chan a -> ConduitT a void m ()
chanToSink Chan a
chan = (a -> ConduitT a void m ()) -> ConduitT a void m ()
forall (m :: * -> *) i o r.
Monad m =>
(i -> ConduitT i o m r) -> ConduitT i o m ()
awaitForever (IO () -> ConduitT a void m ()
forall a. IO a -> ConduitT a void m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ConduitT a void m ())
-> (a -> IO ()) -> a -> ConduitT a void m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Chan a -> a -> IO ()
forall a. Chan a -> a -> IO ()
writeChan Chan a
chan)