-- 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 -- bottom (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 -- | 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 -- | Creates a new, empty PVar, and returns both a reference you can -- use to fill the value later as well as 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 a IVar. Raises a -- AlreadyHasAValue exception if the PVar already has a -- value. writePVar :: PVar a -> a -> IO () -- | Try to read a procrastinating variable. Returns Nothing if the -- value is not ready yet. tryReadPVar :: PVar a -> IO (Maybe a) -- | Writes a value to a PVar. Returns True if successful. tryWritePVar :: PVar a -> a -> IO Bool -- | The exception raised when a PVar is accessed before it is -- ready. data AccessedTooEarly -- | The exception raised 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