module Control.Concurrent.STM.TMVar.ReadOnly
( ReadOnlyTMVar
, ofTMVar
, takeTMVar
, readTMVar
, tryTakeTMVar
, isEmptyTMVar
) where

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

newtype ReadOnlyTMVar a = ReadOnlyTMVar (TMVar a)
                      deriving Eq

ofTMVar :: TMVar a -> ReadOnlyTMVar a
ofTMVar = ReadOnlyTMVar

takeTMVar :: ReadOnlyTMVar a -> STM a
takeTMVar (ReadOnlyTMVar var) =
  TMVar.takeTMVar var

readTMVar :: ReadOnlyTMVar a -> STM a
readTMVar (ReadOnlyTMVar var) =
  TMVar.readTMVar var

tryTakeTMVar :: ReadOnlyTMVar a -> STM (Maybe a)
tryTakeTMVar (ReadOnlyTMVar var) =
  TMVar.tryTakeTMVar var
  
isEmptyTMVar :: (ReadOnlyTMVar a) -> STM Bool
isEmptyTMVar (ReadOnlyTMVar var) =
  TMVar.isEmptyTMVar var