------------------------------------------------------------------------------ --- Library for handling global entities. --- A global entity has a name declared in the program. --- Its value can be accessed and modified by IO actions. --- Furthermore, global entities can be declared as persistent so that --- their values are stored across different program executions. --- --- Currently, it is still experimental so that its interface might --- be slightly changed in the future. --- --- A global entity g with an initial value v --- of type t must be declared by: --- --- g :: Global t
--- g = global v spec --- --- Here, the type t must not contain type variables and --- spec specifies the storage mechanism for the --- global entity (see type GlobalSpec). --- --- --- @author Michael Hanus --- @version June 2007 ------------------------------------------------------------------------------ module Global(Global,GlobalSpec(..),global,readGlobal,writeGlobal) where ---------------------------------------------------------------------- --- The general type of dynamic predicates. data Global a -- = GlobalDef a GlobalSpec --- global is only used for the declaration of a global value --- and should not be used elsewhere. In the future, it might become a keyword. global :: a -> GlobalSpec -> Global a global external --v s = GlobalDef v s --- The storage mechanism for the global entity. --- @cons Temporary - the global value exists only during a single execution --- of a program --- @cons Persistent f - the global value is stored persisently in file f --- (which is created and initialized if it does not exists) data GlobalSpec = Temporary | Persistent String --- Reads the current value of a global. readGlobal :: Global a -> IO a readGlobal g = prim_readGlobal $# g prim_readGlobal :: Global a -> IO a prim_readGlobal external --- Updates the value of a global. --- The value is evaluated to a ground constructor term before it is updated. writeGlobal :: Global a -> a -> IO () writeGlobal g v = (prim_writeGlobal $# g) $## v prim_writeGlobal :: Global a -> a -> IO () prim_writeGlobal external ------------------------------------------------------------------------