{-# LANGUAGE ExistentialQuantification #-}

module Control.Concurrent.STM.TVar.ReadOnly
( ReadOnlyTVar
, toReadOnlyTVar
, readTVar
, readTVarIO
) where

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

data ReadOnlyTVar b = forall a . ReadOnlyTVar (TVar a) (a -> b)

toReadOnlyTVar :: TVar a -> ReadOnlyTVar a
toReadOnlyTVar var = ReadOnlyTVar var id

readTVar :: ReadOnlyTVar a -> STM a
readTVar (ReadOnlyTVar var f) =
  f <$> TVar.readTVar var

readTVarIO :: ReadOnlyTVar a -> IO a
readTVarIO (ReadOnlyTVar var f) =
  f <$> TVar.readTVarIO var