2 | import public Data.IORef
3 | import public Control.Monad.ST
4 | import Control.Monad.State.Interface
9 | interface Monad m => Ref m r | m where
10 | newRef : {0 a : Type} -> a -> m (r a)
11 | readRef : {0 a : Type} -> r a -> m a
12 | writeRef : r a -> a -> m ()
15 | modifyRef : (a -> a) -> r a -> m a
16 | modifyRef f ref = do
18 | writeRef ref (f old) $> old
21 | modifyRef_ : Ref m r => (a -> a) -> r a -> m ()
22 | modifyRef_ = ignore .: modifyRef
25 | HasIO io => Ref io IORef where
28 | writeRef = writeIORef
31 | Ref (ST s) (STRef s) where
34 | writeRef = writeSTRef
36 | namespace MonadState
39 | ForRef : Ref m r => Monad m => r a -> MonadState a m
40 | ForRef ref = MS where
42 | [MS] MonadState a m where