-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Encapsulating mutatable state in external libraries -- @package foreign-var @version 0 module Foreign.Var -- | This data type represents a piece of mutable, imperative state with -- possible side-effects. These tend to encapsulate all sorts tricky -- behavior in external libraries, and may well throw exceptions. -- -- Inhabitants should satsify the following properties. -- -- In the absence of concurrent mutation from other threads or a thrown -- exception: -- --
-- do x <- getVar v; setVar v y; setVar v x ---- -- should restore the previous state. -- -- Ideally, in the absence of thrown exceptions: -- --
-- setVar v a >> getVar v ---- -- should return a, regardless of a. In practice some -- Vars only permit a very limited range of value assignments, and -- do not report failure. -- -- The result of updateVar should also be compatible with the -- result of getting and setting separately, however, it may be more -- efficient or have better atomicity properties in a concurrent setting. data Var a Var :: IO a -> ((a -> a) -> IO ()) -> ((a -> a) -> IO ()) -> (a -> IO ()) -> Var a -- | Used by get getVar :: Var a -> IO a -- | Used by ($~) updateVar :: Var a -> (a -> a) -> IO () -- | Used by ($~!) updateVar' :: Var a -> (a -> a) -> IO () -- | Used by ($=) setVar :: Var a -> a -> IO () -- | Build a Var form a getter and a setter. newVar :: (IO a) -> (a -> IO ()) -> Var a -- | Change the type of a Var mapVar :: (b -> a) -> (a -> b) -> Var a -> Var b newtype SettableVar a SettableVar :: (a -> IO ()) -> SettableVar a type GettableVar = IO class HasSetter t a | t -> a ($=) :: (HasSetter t a, MonadIO m) => t -> a -> m () ($=!) :: (HasSetter t a, MonadIO m) => t -> a -> m () class HasSetter t a => HasUpdate t a b | t -> a b where r $~ f = liftIO $ do { a <- get r; r $= f a } r $~! f = liftIO $ do { a <- get r; r $=! f a } ($~) :: (HasUpdate t a b, MonadIO m) => t -> (a -> b) -> m () ($~!) :: (HasUpdate t a b, MonadIO m) => t -> (a -> b) -> m () class HasGetter t a | t -> a get :: (HasGetter t a, MonadIO m) => t -> m a instance Typeable Var instance Typeable SettableVar instance HasGetter (IORef a) a instance Storable a => HasGetter (Ptr a) a instance HasGetter (STM a) a instance HasGetter (IO a) a instance HasGetter (TVar a) a instance HasGetter (Var a) a instance HasUpdate (TVar a) a a instance HasUpdate (IORef a) a a instance Storable a => HasUpdate (Ptr a) a a instance HasUpdate (Var a) a a instance HasSetter (TVar a) a instance HasSetter (IORef a) a instance Storable a => HasSetter (Ptr a) a instance HasSetter (Var a) a instance HasSetter (SettableVar a) a