metronome-0.1: Control/Concurrent/STMOrIO.hs
{-# LANGUAGE ScopedTypeVariables, MultiParamTypeClasses, FlexibleInstances #-}
-- |
-- Module : Control.Concurrent.STMOrIO
-- Copyright : (c) Paolo Veronelli 2012
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : paolo.veronelli@gmail.com
-- Stability : unstable
-- Portability : not portable (requires STM)
--
-- Unifying functions of TVar's and TChans in STM and IO via atomically.
--
module Control.Concurrent.STMOrIO where
import Control.Concurrent.STM
-- | uniforming class for STM or IO
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 to uniform reading and writing
class RW m z where
-- | read a z
rd :: z a -> m a
-- | modify a z
wr :: z a -> a -> m ()
-- | modify a cell z under STM or IO
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
-- | new TVar
var :: STMOrIO m
=> a -- ^ initial value
-> m (TVar a)
var = stmorio . newTVar
-- | new TChan
chan :: forall m a . STMOrIO m
=> a -- ^ type proxy value
-> m (TChan a)
chan _ = stmorio (newTChan :: STM (TChan a))