-- ----------------------------------------------------------------------------- -- | 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