module Control.Concurrent.Chan.ReadOnly
( ReadOnlyChan
, toReadOnlyChan
, readChan
, dupReadOnlyChan
, getChanContents
) where
import Control.Concurrent.Chan.Lifted (Chan)
import qualified Control.Concurrent.Chan.Lifted as Chan
import Control.Monad.Base
data ReadOnlyChan b = forall a . ReadOnlyChan (Chan a) (a -> b)
instance Functor ReadOnlyChan where
fmap f (ReadOnlyChan c f') = ReadOnlyChan c (f . f')
toReadOnlyChan :: Chan a -> ReadOnlyChan a
toReadOnlyChan c = ReadOnlyChan c id
readChan :: MonadBase IO m => ReadOnlyChan a -> m a
readChan (ReadOnlyChan chan f) =
f <$> Chan.readChan chan
dupReadOnlyChan :: MonadBase IO m => ReadOnlyChan a -> m (ReadOnlyChan a)
dupReadOnlyChan (ReadOnlyChan chan f) = do
dup <- Chan.dupChan chan
return (ReadOnlyChan dup f)
getChanContents :: MonadBase IO m => ReadOnlyChan a -> m [a]
getChanContents (ReadOnlyChan chan f) =
fmap f <$> Chan.getChanContents chan