-- | 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