module Control.Concurrent.STM.TChan.ReadOnly
( ReadOnlyTChan
, toReadOnlyTChan
, readTChan
, dupReadOnlyTChan
) where
import Control.Concurrent.STM (STM)
import Control.Concurrent.STM.TChan (TChan)
import qualified Control.Concurrent.STM.TChan as TChan
data ReadOnlyTChan b = forall a . ReadOnlyTChan (TChan a) (a -> b)
toReadOnlyTChan :: TChan a -> ReadOnlyTChan a
toReadOnlyTChan chan = ReadOnlyTChan chan id
readTChan :: ReadOnlyTChan a -> STM a
readTChan (ReadOnlyTChan chan f) =
f <$> TChan.readTChan chan
dupReadOnlyTChan :: ReadOnlyTChan a -> STM (ReadOnlyTChan a)
dupReadOnlyTChan (ReadOnlyTChan chan f) = do
dup <- TChan.dupTChan chan
return (ReadOnlyTChan dup f)