2 | import System.Concurrency
9 | data Mut : Type -> Type where [external]
11 | %extern prim__newIORef : forall a . a -> (1 x : %World) -> IORes (Mut a)
12 | %extern prim__readIORef : forall a . Mut a -> (1 x : %World) -> IORes a
13 | %extern prim__writeIORef : forall a . Mut a -> (1 val : a) -> (1 x : %World) -> IORes ()
16 | data IORef : Type -> Type where
17 | MkRef : Mut a -> IORef a
21 | newIORef : HasIO io => a -> io (IORef a)
23 | = do m <- primIO (prim__newIORef val)
29 | readIORef : HasIO io => IORef a -> io a
30 | readIORef (MkRef m) = primIO (prim__readIORef m)
37 | writeIORef : HasIO io => IORef a -> (val : a) -> io ()
38 | writeIORef (MkRef m) val = primIO (prim__writeIORef m val)
45 | writeIORef1 : HasLinearIO io => IORef a -> (1 val : a) -> io ()
46 | writeIORef1 (MkRef m) val = primIO1 (prim__writeIORef m val)
51 | modifyIORef : HasIO io => IORef a -> (a -> a) -> io ()
53 | = do val <- readIORef ref
54 | writeIORef ref (f val)
61 | atomically : HasIO io => Mutex -> io () -> io ()
63 | = do mutexAcquire lock