{-# LANGUAGE ExistentialQuantification #-}

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

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

data ReadOnlyTMVar b = forall a . ReadOnlyTMVar (TMVar a) (a -> b)

toReadOnlyTMVar :: TMVar a -> ReadOnlyTMVar a
toReadOnlyTMVar var = ReadOnlyTMVar var id

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

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

tryTakeTMVar :: ReadOnlyTMVar a -> STM (Maybe a)
tryTakeTMVar (ReadOnlyTMVar var f) =
  fmap f <$> TMVar.tryTakeTMVar var

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