diff -r 400d49213290 -r 1baf8e3b8ef2 src/System/IO/Streams/Concurrent/Unagi/Bounded.hs --- a/src/System/IO/Streams/Concurrent/Unagi/Bounded.hs Thu Dec 18 10:56:53 2014 -0600 +++ b/src/System/IO/Streams/Concurrent/Unagi/Bounded.hs Thu Dec 18 11:43:53 2014 -0600 @@ -6,14 +6,17 @@ , chanToInput , chanToOutput , makeChanPipe + , chanToPipe + , dupStream ) where ------------------------------------------------------------------------------ import Control.Applicative ((<$>), (<*>)) import Control.Concurrent.Chan.Unagi.Bounded (InChan, OutChan, - newChan, readChan, - writeChan) + dupChan, newChan, + readChan, writeChan) +import Control.Monad ((>=>)) import Prelude hiding (read) import System.IO.Streams.Internal (InputStream, OutputStream, @@ -57,3 +60,20 @@ makeChanPipe size = do (inChan, outChan) <- newChan size (,) <$> chanToInput outChan <*> chanToOutput inChan + + +-------------------------------------------------------------------------------- +-- | Create a new pair of streams form the given 'Chan'. Everything written +-- to the 'OutputStream' will appear as-is on the 'InputStream'. +-- +-- Since reading from the 'InputStream' and writing to the 'OutputStream' are +-- blocking calls, be sure to do so in different threads. +chanToPipe :: (InChan (Maybe a), OutChan (Maybe a)) -> IO (InputStream a, OutputStream a) +chanToPipe (inChan, outChan) = (,) <$> chanToInput outChan <*> chanToOutput inChan + + +-------------------------------------------------------------------------------- +-- | Create a new input stream duplicated from the 'InChan' +-- +dupStream :: InChan (Maybe a) -> IO (InputStream a) +dupStream = dupChan >=> chanToInput