module Control.Concurrent.STM.TChan.ReadOnly
( ReadOnlyTChan
, ofTChan
, readTChan
, dupTChan
) where

import Control.Concurrent.STM (STM)
import qualified Control.Concurrent.STM.TChan as TChan
import Control.Concurrent.STM.TChan (TChan)

newtype ReadOnlyTChan a = ReadOnlyTChan (TChan a)
                     
ofTChan :: TChan a -> ReadOnlyTChan a
ofTChan = ReadOnlyTChan

readTChan :: ReadOnlyTChan a -> STM a
readTChan (ReadOnlyTChan chan) =
  TChan.readTChan chan

dupTChan :: ReadOnlyTChan a -> STM (ReadOnlyTChan a)
dupTChan (ReadOnlyTChan chan) = do
  dup <- TChan.dupTChan chan
  return (ofTChan dup)