4 | import System.Concurrency
30 | newMVar : a -> IO (MVar a)
31 | newMVar v = [| MV (newIORef v) makeMutex |]
33 | withLock : MVar a -> (IORef a -> IO b) -> IO b
35 | mutexAcquire mv.lock
37 | mutexRelease mv.lock
42 | readMVar : MVar a -> IO a
43 | readMVar mv = withLock mv readIORef
47 | writeMVar : MVar a -> a -> IO ()
48 | writeMVar mv v = withLock mv (`writeIORef` v)
52 | modifyMVar : MVar a -> (a -> a) -> IO ()
53 | modifyMVar mv f = withLock mv (`modifyIORef` f)
58 | evalState : MVar a -> (a -> (a,b)) -> IO b
60 | withLock mv $
\ref => do
61 | (st,res) <- f <$> readIORef ref
70 | record MQueue a where
72 | var : MVar (Queue a)
75 | newMQueue : IO (MQueue a)
76 | newMQueue = MQ <$> newMVar empty
79 | enqueue : MQueue a -> a -> IO ()
80 | enqueue (MQ m) v = modifyMVar m (`enqueue` v)
83 | dequeue : MQueue a -> IO (Maybe a)
85 | evalState m $
\x => case dequeue x of
86 | Nothing => (x,Nothing)
87 | Just (v,y) => (y, Just v)