Idris2/libs/base/Data/IORef.idr

41 lines
1.1 KiB
Idris
Raw Normal View History

2020-05-18 15:59:07 +03:00
module Data.IORef
-- Implemented externally
-- e.g., in Scheme, passed around as a box
data Mut : Type -> Type where [external]
%extern prim__newIORef : forall a . a -> (1 x : %World) -> IORes (Mut a)
%extern prim__readIORef : forall a . Mut a -> (1 x : %World) -> IORes a
%extern prim__writeIORef : forall a . Mut a -> (1 val : a) -> (1 x : %World) -> IORes ()
export
data IORef : Type -> Type where
MkRef : Mut a -> IORef a
export
newIORef : HasIO io => a -> io (IORef a)
2020-05-18 15:59:07 +03:00
newIORef val
= do m <- primIO (prim__newIORef val)
pure (MkRef m)
%inline
2020-05-18 15:59:07 +03:00
export
readIORef : HasIO io => IORef a -> io a
2020-05-18 15:59:07 +03:00
readIORef (MkRef m) = primIO (prim__readIORef m)
%inline
2020-05-18 15:59:07 +03:00
export
writeIORef : HasIO io => IORef a -> (val : a) -> io ()
2020-05-18 15:59:07 +03:00
writeIORef (MkRef m) val = primIO (prim__writeIORef m val)
%inline
export
writeIORef1 : HasLinearIO io => IORef a -> (1 val : a) -> io ()
writeIORef1 (MkRef m) val = primIO1 (prim__writeIORef m val)
2020-05-18 15:59:07 +03:00
export
modifyIORef : HasIO io => IORef a -> (a -> a) -> io ()
2020-05-18 15:59:07 +03:00
modifyIORef ref f
= do val <- readIORef ref
writeIORef ref (f val)