{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes            #-}
module Control.Concurrent.NQE.Network
    ( fromSource
    , withSource
    ) where

import           Control.Concurrent.NQE.Process
import           Data.Conduit
import           UnliftIO

fromSource ::
       (MonadIO m, Mailbox mbox)
    => ConduitT () msg m ()
    -> mbox msg -- ^ will receive all messages
    -> m ()
fromSource src mbox = runConduit $ src .| awaitForever (`send` mbox)

withSource ::
       (MonadUnliftIO m, Mailbox mbox)
    => ConduitT () msg m ()
    -> mbox msg
    -> (Async () -> m a)
    -> m a
withSource src mbox = withAsync (fromSource src mbox)