module Control.Concurrent.MVar.ReadOnly
( ReadOnlyMVar
, toReadOnlyMVar
) where
import Control.Concurrent.MVar (MVar)
import Control.Concurrent.MVar.Class
data ReadOnlyMVar b = forall a . ReadOnlyMVar (MVar a) (a -> b)
instance Functor ReadOnlyMVar where
fmap f (ReadOnlyMVar var f') = ReadOnlyMVar var (f . f')
toReadOnlyMVar :: MVar a -> ReadOnlyMVar a
toReadOnlyMVar var = ReadOnlyMVar var id
instance MVarRead ReadOnlyMVar where
takeMVar (ReadOnlyMVar var f) = f <$> takeMVar var
readMVar (ReadOnlyMVar var f) = f <$> readMVar var
tryReadMVar (ReadOnlyMVar var f) = fmap f <$> tryReadMVar var
tryTakeMVar (ReadOnlyMVar var f) = fmap f <$> tryTakeMVar var
withMVar (ReadOnlyMVar var f) w = withMVar var (w . f)