module Control.Concurrent.STM.TChan.WriteOnly 
( WriteOnlyTChan
, ofChan
, writeTChan
, dupTChan
, unGetTChan
, isEmptyTChan
) where

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

newtype WriteOnlyTChan a = WriteOnlyTChan (TChan a)

ofChan :: TChan a -> WriteOnlyTChan a
ofChan = WriteOnlyTChan

writeTChan :: WriteOnlyTChan a -> a -> STM ()
writeTChan (WriteOnlyTChan chan) =
  TChan.writeTChan chan
  
dupTChan :: WriteOnlyTChan a -> STM (WriteOnlyTChan a)
dupTChan (WriteOnlyTChan chan) = do
  dup <- TChan.dupTChan chan
  return (ofChan dup)
  
unGetTChan :: WriteOnlyTChan a -> a -> STM ()
unGetTChan (WriteOnlyTChan chan) =                
  TChan.unGetTChan chan

isEmptyTChan :: WriteOnlyTChan a -> STM Bool
isEmptyTChan (WriteOnlyTChan chan) =
  TChan.isEmptyTChan chan