linear-maps-0.5: Data/Control/Kvantum.hs
--
-----------------------------------------------------------------------------
-- | Data control kvantums
-----------------------------------------------------------------------------
module Data.Control.Kvantum
( K
, create -- IO K
, hit -- K -> IO ()
, kill -- K -> IO ()
, renew -- K -> IO K
, join -- K -> K -> IO K
) where
import Control.Concurrent.MVar
----------------------------------------------
type K = [MVar ()]
create :: IO K
create = fmap (:[]) $ newMVar ()
hit :: K -> IO ()
hit = mapM_ f where
f x = do
y <- readMVar x
y `seq` return y
kill :: String -> K -> IO ()
kill msg = mapM_ $ flip swapMVar $ error msg
renew :: String -> K -> IO K
renew msg k = do
hit k
kill msg k
create
join :: K -> K -> IO K
join k1 k2 = return $ k1 ++ k2