-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Encapsulating mutatable state in external libraries -- @package foreign-var @version 0.1 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 <- get v; v $= y; v $= x
--   
-- -- should restore the previous state. -- -- Ideally, in the absence of thrown exceptions: -- --
--   v $= a >> get 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. data Var a Var :: (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