From 1b07fb994363495a102d6b86a5f847a771a6f3b9 Mon Sep 17 00:00:00 2001 From: Luke Hoersten Date: Thu, 18 Dec 2014 11:43:53 -0600 Subject: Added some functions to help exposed chans to streams. --- src/System/IO/Streams/Concurrent/Unagi.hs | 24 +++++++++++++++++++++-- src/System/IO/Streams/Concurrent/Unagi/Bounded.hs | 24 +++++++++++++++++++++-- unagi-streams.cabal | 6 +++--- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/System/IO/Streams/Concurrent/Unagi.hs b/src/System/IO/Streams/Concurrent/Unagi.hs index 7ee3fd5..141902f 100644 --- a/src/System/IO/Streams/Concurrent/Unagi.hs +++ b/src/System/IO/Streams/Concurrent/Unagi.hs @@ -6,13 +6,16 @@ module System.IO.Streams.Concurrent.Unagi , chanToInput , chanToOutput , makeChanPipe + , chanToPipe + , dupStream ) where ------------------------------------------------------------------------------ import Control.Applicative ((<$>), (<*>)) -import Control.Concurrent.Chan.Unagi (InChan, OutChan, newChan, - readChan, writeChan) +import Control.Concurrent.Chan.Unagi (InChan, OutChan, dupChan, + newChan, readChan, writeChan) +import Control.Monad ((>=>)) import Prelude hiding (read) import System.IO.Streams.Internal (InputStream, OutputStream, makeInputStream, @@ -56,3 +59,20 @@ makeChanPipe :: IO (InputStream a, OutputStream a) makeChanPipe = do (inChan, outChan) <- newChan (,) <$> 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 diff --git a/src/System/IO/Streams/Concurrent/Unagi/Bounded.hs b/src/System/IO/Streams/Concurrent/Unagi/Bounded.hs index fe1e856..96fc6e4 100644 --- a/src/System/IO/Streams/Concurrent/Unagi/Bounded.hs +++ b/src/System/IO/Streams/Concurrent/Unagi/Bounded.hs @@ -6,14 +6,17 @@ module System.IO.Streams.Concurrent.Unagi.Bounded , 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 :: Int -> IO (InputStream a, OutputStream a) 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 diff --git a/unagi-streams.cabal b/unagi-streams.cabal index ed91f29..b2d0d1b 100644 --- a/unagi-streams.cabal +++ b/unagi-streams.cabal @@ -1,9 +1,9 @@ name: unagi-streams version: 0.1.1.0 synopsis: Unagi Chan IO-Streams -description: IO-Streams implemented underneath with Unagi - channels. This library is a straight port of Greg Collins' IO-Streams - Chan implementation. +description: Io-streams chans implemented underneath with + unagi-chans. This library is a straight port of + the default io-streams chan implementation. License: BSD3 License-file: LICENSE author: Luke Hoersten -- cgit v1.2.3