module Control.Concurrent.STMOrIO where
import Control.Concurrent.STM
class (Functor m, Monad m) => STMOrIO m where
stmorio :: STM a -> m a
instance STMOrIO IO where
stmorio = atomically
instance STMOrIO STM where
stmorio = id
class RW m z where
rd :: z a -> m a
wr :: z a -> a -> m ()
md :: (Monad m, RW m z) => z a -> (a -> a) -> m ()
md x f = rd x >>= \y -> wr x (f y)
instance STMOrIO t => RW t TVar where
rd = stmorio . readTVar
wr x = stmorio . writeTVar x
instance STMOrIO t => RW t TChan where
rd = stmorio . readTChan
wr x = stmorio . writeTChan x
var :: STMOrIO m
=> a
-> m (TVar a)
var = stmorio . newTVar
chan :: forall m a . STMOrIO m
=> a
-> m (TChan a)
chan _ = stmorio (newTChan :: STM (TChan a))