module Control.Concurrent.Chan.Split (
newSplitChan
, InChan()
, OutChan()
, getChanContents
, dupChan
) where
import qualified Control.Concurrent.Chan as C
import Data.Cofunctor
import Control.Applicative
import Control.Arrow
import Control.Concurrent.Chan.Class
data InChan i where
InChan :: (i -> a) -> C.Chan a -> InChan i
data OutChan o where
OutChan :: (a -> o) -> C.Chan a -> OutChan o
newSplitChan :: IO (InChan a, OutChan a)
newSplitChan = (InChan id &&& OutChan id) <$> C.newChan
instance WritableChan InChan where
writeChan (InChan f c) = C.writeChan c . f
writeList2Chan (InChan f c) = C.writeList2Chan c . map f
instance ReadableChan OutChan where
readChan (OutChan f c) = f <$> C.readChan c
instance Cofunctor InChan where
cofmap f' (InChan f c) = InChan (f . f') c
instance Functor OutChan where
fmap f' (OutChan f c) = OutChan (f' . f) c
getChanContents :: OutChan a -> IO [a]
getChanContents (OutChan f c) = map f <$> C.getChanContents c
dupChan :: OutChan a -> IO (OutChan a)
dupChan (OutChan f c) = OutChan f <$> C.dupChan c