-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Haskell values that cannot be evaluated immediately. -- -- Procrastinating variables (PVars) are meant to be used in cases -- where you want to give someone a value that you do not have available -- yet, but will definitely have ready by the time that they need to use -- it. -- -- PVars have the advantage that you do not make the user of your -- value execute some kind of unwrapping routine in order to get access -- to the value within. For example, this is useful when you are -- constructing closures that you want to go ahead and construct now even -- though some of the values that they contain are not available yet. -- -- PVars are implemented with a lazy thunk that reads from an -- IORef; before the IORef is written to, it contains _|_ -- (an exception with a descriptive error message) so that an error is -- raised in the user code if the variable is accidently accessed before -- the value is ready. -- -- NOTE: PVars are modeled closely on the IVar -- implementation in the ivar-simple package. The major difference is -- that if you try to read an IVar before it has been given a -- value, it blocks until the value is available, whereas reading from a -- PVar before it is ready raises an exception. The reason behind -- the different symantics for PVar is because if the user -- accidently accesses the value too early, you want there to be a lot of -- noise to let him or her know about it, rather than merely blocking the -- thread indefinitely and causing them to wonder what went wrong. @package procrastinating-variable @version 1.0.2 -- | Procrastinating variables (PVars) are meant to be used in cases -- where you want to give someone a value that you do not have available -- yet, but will definitely have ready by the time that they need to use -- it. -- -- PVars have the advantage that you do not make the user of your -- value execute some kind of unwrapping routine in order to get access -- to the value within. For example, this is useful when you are -- constructing closures that you want to go ahead and construct now even -- though some of the values that they contain are not available yet. -- -- PVars are implemented with a lazy thunk that reads from an -- IORef; before the IORef is written to, it contains -- _|_ ( in the form of an exception with a descriptive error -- message) so that an error is raised in the user code if the variable -- is accidently accessed before the value is ready. -- -- NOTE: PVars are modeled closely on the IVar -- implementation in the ivar-simple package. The major difference is -- that if you try to read an IVar before it has been given a -- value, it blocks until the value is available, whereas reading from a -- PVar before it is ready raises an exception. The reason behind -- the different symantics for PVar is because if the user -- accidently accesses the value too early, you want there to be a lot of -- noise to let him or her know about it, rather than merely blocking the -- thread indefinitely and causing them to wonder what went wrong. module Data.PVar -- | A procrastinating variable (PVar for short). data PVar a -- | Creates a new, empty PVar, and returns both a reference you can -- use to fill the value later as well as a lazy thunk which you can -- treat as a normal variable; the latter evaluates to the value stored -- in the reference if it is available and to bottom otherwise. newPVar :: IO (PVar a, a) -- | Creates a new, empty PVar that raises an exception with a -- custom message. (Use this if you want to make explicit to the user of -- this variable exactly when they should expect its value to become -- available.) newPVarWithCustomMessage :: String -> IO (PVar a, a) -- | Writes a value to a PVar. Raises an AlreadyHasAValue -- exception if the PVar already has a value. writePVar :: PVar a -> a -> IO () -- | Tries to read a PVar, but does not throw an exception if the -- value is not ready yet; instead, if the value is ready it returns -- Just value and otherwise it returns Nothing. tryReadPVar :: PVar a -> IO (Maybe a) -- | Attempts to a value to a PVar, but instead of throwing an -- exception it returns True if it was successful and False -- otherwise. tryWritePVar :: PVar a -> a -> IO Bool -- | The exception raised when a PVar is accessed before it is -- ready. data AccessedTooEarly -- | The exception raised by writePVar when one attempts to write to -- a PVar after it has already been given a value. data AlreadyHasAValue instance Typeable AlreadyHasAValue instance Typeable AccessedTooEarly instance Show AlreadyHasAValue instance Show AccessedTooEarly instance Exception AlreadyHasAValue instance Exception AccessedTooEarly