@@ -1,5 +1,52 @@
1module Data.IORef
1module Data.IORef
4+interface HasReference (ffi : FFI) where
6+ newIORef' : a -> IO' ffi (IORef' a)
7+ readIORef' : IORef' a -> IO' ffi a
8+ writeIORef' : IORef' a -> a -> IO' ffi ()
11+modifyIORef': HasReference ffi => IORef' {ffi = ffi} a -> (a -> a) -> IO' ffi ()
14+ val <- readIORef' ref
15+ writeIORef' ref (fn val)
18+implementation HasReference FFI_C where
21+ foreign FFI_C "idris_newRef" (Raw a -> IO (Raw a)) (MkRaw val)
24+ MkRaw val <- foreign FFI_C "idris_readRef" (Raw a -> IO (Raw a)) ref
26+ writeIORef' ref val =
27+ foreign FFI_C "idris_writeRef" (Raw a -> Raw a -> IO ())
32+IORef = IORef' {ffi = FFI_C}
35+newIORef : a -> IO (IORef a)
39+readIORef : IORef a -> IO a
40+readIORef = readIORef'
43+writeIORef : IORef a -> a -> IO ()
44+writeIORef = writeIORef'
47+modifyIORef : IORef a -> (a -> a) -> IO ()
48+modifyIORef = modifyIORef'
4data IORef a = MkIORef a
51data IORef a = MkIORef a
@@ -26,3 +73,4 @@ modifyIORef : IORef a -> (a -> a) -> IO ()
26modifyIORef ref fn
73modifyIORef ref fn
27 = do val <- readIORef ref
74 = do val <- readIORef ref
28 writeIORef ref (fn val)
75 writeIORef ref (fn val)