module Control.Concurrent.STM.MultiTVar (
MultiTVar(..)
, loosenTVar
, makeMultiTVar
, zoomMultiTVar
, newMultiTVar, newMultiTVarIO
, readMultiTVar, readMultiTVarIO
, readMultiTVarList, readMultiTVarListIO
, readMultiTVarHead, readMultiTVarHeadIO
, modifyMultiTVar, modifyMultiTVar'
, writeMultiTVar
) where
import Control.Concurrent.STM.TVar.Zoom
import Control.Lens
data MultiTVar a where
MultiTVar :: TVar x -> ATraversal' x a -> MultiTVar a
loosenTVar :: TVar a -> MultiTVar a
loosenTVar v = MultiTVar v id
makeMultiTVar :: ATraversal' x a -> TVar x -> MultiTVar a
makeMultiTVar = flip MultiTVar
zoomMultiTVar :: ATraversal' a b -> MultiTVar a -> MultiTVar b
zoomMultiTVar t1 (MultiTVar v t2) = MultiTVar v . confusing $ cloneTraversal t2 . cloneTraversal t1
newMultiTVar :: a -> STM (MultiTVar a)
newMultiTVar a = MultiTVar <$> newTVar a <*> pure id
newMultiTVarIO :: a -> IO (MultiTVar a)
newMultiTVarIO a = MultiTVar <$> newTVarIO a <*> pure id
readMultiTVar :: Monoid a => MultiTVar a -> STM a
readMultiTVar (MultiTVar v t) = (^. cloneTraversal t) <$> readTVar v
readMultiTVarIO :: Monoid a => MultiTVar a -> IO a
readMultiTVarIO (MultiTVar v t) = (^. cloneTraversal t) <$> readTVarIO v
readMultiTVarList :: MultiTVar a -> STM [a]
readMultiTVarList (MultiTVar v t) = (^.. cloneTraversal t) <$> readTVar v
readMultiTVarListIO :: MultiTVar a -> IO [a]
readMultiTVarListIO (MultiTVar v t) = (^.. cloneTraversal t) <$> readTVarIO v
readMultiTVarHead :: MultiTVar a -> STM (Maybe a)
readMultiTVarHead (MultiTVar v t) = (^? cloneTraversal t) <$> readTVar v
readMultiTVarHeadIO :: MultiTVar a -> IO (Maybe a)
readMultiTVarHeadIO (MultiTVar v t) = (^? cloneTraversal t) <$> readTVarIO v
modifyMultiTVar :: MultiTVar a -> (a -> a) -> STM ()
modifyMultiTVar (MultiTVar v t) f = modifyTVar v $ cloneTraversal t %~ f
modifyMultiTVar' :: MultiTVar a -> (a -> a) -> STM ()
modifyMultiTVar' (MultiTVar v t) f = modifyTVar' v $ cloneTraversal t %~ f
writeMultiTVar :: MultiTVar a -> a -> STM ()
writeMultiTVar (MultiTVar v t) a = modifyTVar' v $ cloneTraversal t .~ a