@@ -3,26 +3,52 @@ module Data.IORef
4data IORef a = MkIORef a
4data IORef a = MkIORef a
7+interface HasReference (ffi : FFI) where
8+ newIORef' : a -> IO' ffi (IORef a)
9+ readIORef' : IORef a -> IO' ffi a
10+ writeIORef' : IORef a -> a -> IO' ffi ()
7−newIORef : a -> IO (IORef a)
13+modifyIORef': HasReference ffi => IORef a -> (a -> a) -> IO' ffi ()
16+ val <- readIORef' ref
17+ writeIORef' ref (fn val)
20+implementation HasReference FFI_C where
8−newIORef val
21+ newIORef' val
9 = do MkRaw ref <- foreign FFI_C "idris_newRef" (Raw a -> IO (Raw a)) (MkRaw val)
22 = do MkRaw ref <- foreign FFI_C "idris_newRef" (Raw a -> IO (Raw a)) (MkRaw val)
10 pure (MkIORef ref)
23 pure (MkIORef ref)
24+ readIORef' (MkIORef ref)
25+ = do MkRaw val <- foreign FFI_C "idris_readRef" (Raw a -> IO (Raw a)) (MkRaw ref)
27+ writeIORef' (MkIORef ref) val
28+ = foreign FFI_C "idris_writeRef" (Raw a -> Raw a -> IO ())
29+ (MkRaw ref) (MkRaw val)
32+implementation HasReference FFI_JS where
34+ (MkIORef . believe_me) <$> foreign FFI_JS "{val: %0}" (Ptr -> JS_IO Ptr) (believe_me val)
35+ readIORef' (MkIORef ref) =
36+ believe_me <$> foreign FFI_JS "%0.val" (Ptr -> JS_IO Ptr) (believe_me ref)
37+ writeIORef' (MkIORef ref) val =
38+ foreign FFI_JS "%0.val = %1" (Ptr -> Ptr -> JS_IO ()) (believe_me ref) (believe_me val)
41+newIORef : a -> IO (IORef a)
13readIORef : IORef a -> IO a
45readIORef : IORef a -> IO a
14−readIORef (MkIORef ref)
46+readIORef = readIORef'
15− = do MkRaw val <- foreign FFI_C "idris_readRef" (Raw a -> IO (Raw a)) (MkRaw ref)
19writeIORef : IORef a -> a -> IO ()
49writeIORef : IORef a -> a -> IO ()
20−writeIORef (MkIORef old) val
50+writeIORef = writeIORef'
21− = foreign FFI_C "idris_writeRef" (Raw a -> Raw a -> IO ())
22− (MkRaw old) (MkRaw val)
25modifyIORef : IORef a -> (a -> a) -> IO ()
53modifyIORef : IORef a -> (a -> a) -> IO ()
26−modifyIORef ref fn
54+modifyIORef = modifyIORef'
27− = do val <- readIORef ref
28− writeIORef ref (fn val)