Agda-2.2.10: src/full/Agda/Utils/Pointer.hs
-- | Wrappers for 'IORef's.
module Agda.Utils.Pointer where
import Control.Monad.Trans
import Data.IORef
type Ptr a = IORef a
deref :: MonadIO io => Ptr a -> io a
deref p = liftIO $ readIORef p
store :: MonadIO io => Ptr a -> a -> io ()
store p x = liftIO $ writeIORef p x
alloc :: MonadIO io => a -> io (Ptr a)
alloc x = liftIO $ newIORef x
updatePtr :: MonadIO io => Ptr a -> (a -> io a) -> io a
updatePtr p f = do
x <- deref p
y <- f x
store p y
return y