0 | module Control.RIO.State
13 | data Read : (lbl : l) -> (a : Type) -> Type where
15 | MkRead : (read_ : IO a) -> Read lbl a
19 | readAt : (0 lbl : l) -> {auto r : Read lbl a} -> HasIO io => io a
20 | readAt _ @{MkRead g} = liftIO g
28 | (.read) : HasIO io => Read lbl a -> io a
29 | (.read) (MkRead r) = liftIO r
38 | data ST : (lbl : l) -> (a : Type) -> Type where
42 | -> (write_ : a -> IO ())
43 | -> (mod_ : (a -> a) -> IO ())
47 | mkST : HasIO io => a -> io (ST lbl a)
50 | pure $
MkST (readIORef ref) (writeIORef ref) (modifyIORef ref)
52 | export %hint %inline
53 | stToRead : ST lbl a => Read lbl a
54 | stToRead @{MkST r _ _} = MkRead r
58 | mapST : (a -> b) -> (b -> a -> a) -> ST lbl a -> ST lbl2 b
59 | mapST f g (MkST r w m) =
60 | MkST (map f r) (\v => m (g v)) (\h => m (\va => g (h $
f va) va))
64 | modifyAt : (0 lbl : l) -> {auto st : ST lbl a} -> HasIO io => (a -> a) -> io ()
65 | modifyAt _ @{MkST _ _ m} f = liftIO (m f)
69 | getAt : (0 lbl : l) -> {auto set : ST lbl a} -> HasIO io => io a
70 | getAt _ @{MkST r _ _} = liftIO r
74 | setAt : (0 lbl : l) -> {auto set : ST lbl a} -> HasIO io => a -> io ()
75 | setAt _ @{MkST _ w _} v = liftIO (w v)
81 | (.get) : HasIO io => ST lbl a -> io a
82 | (.get) (MkST r _ _) = liftIO r
88 | (.set) : HasIO io => ST lbl a -> a -> io ()
89 | (.set) (MkST _ w _) v = liftIO $
w v
95 | (.mod) : HasIO io => ST lbl a -> (a -> a) -> io ()
96 | (.mod) (MkST _ _ m) f = liftIO $
m f