signature STORE
structure Store : STORE
The Store structure provides an interface to the Alice store that holds all data at runtime.
Note: This is a low-level module that should be used with care. Some of its functionality can compromise abstractions to a certain extent. For example, it is not encouraged to apply deepWait to values that contain instances of abstract types.
import signature STORE from "x-alice:/lib/data/STORE-sig"
import structure Store from "x-alice:/lib/data/Store"
signature STORE =
sig
exception Stack
val same : 'a * 'a -> bool
val equiv : 'a * 'a -> bool
val minimize : 'a -> 'a
val futures : 'a -> {total : int, concurrent : int, byneed : int}
val deepWait : 'a -> {total : int, concurrent : int, byneed : int}
val size : 'a -> {nodes : int, words : int}
val sizeQuiet : 'a -> {nodes : int, words : int}
val collect : int -> unit
val signal : (IntInf.int * (IntInf.int -> unit)) option -> unit
structure Map :
sig
type ('a,'b) map
type ('a,'b) t = ('a,'b) map
exception Unknown
exception Collision
val map : unit -> ('a,'b) map
val clone : ('a,'b) map -> ('a,'b) map
val fromList : ('a * 'b) list -> ('a,'b) map
val fromVector : ('a * 'b) vector -> ('a,'b) map
val toList : ('a,'b) map -> ('a * 'b) list
val toVector : ('a,'b) map -> ('a * 'b) vector
val insert : ('a,'b) map * 'a * 'b -> unit
val insertDisjoint : ('a,'b) map * 'a * 'b -> unit
val insertWith : ('b * 'b -> 'b) -> ('a,'b) map * 'a * 'b -> unit
val insertWithi : ('a * 'b * 'b -> 'b) -> ('a,'b) map * 'a * 'b -> unit
val remove : ('a,'b) map * 'a -> unit
val removeExistent : ('a,'b) map * 'a -> unit
val removeWith : ('a -> unit) -> ('a,'b) map * 'a -> unit
val removeAll : ('a,'b) map -> unit
val union : ('a,'b) map * ('a,'b) map -> unit
val unionDisjoint : ('a,'b) map * ('a,'b) map -> unit
val unionWith : ('b * 'b -> 'b) -> ('a,'b) map * ('a,'b) map -> unit
val unionWithi : ('a * 'b * 'b -> 'b) -> ('a,'b) map * ('a,'b) map -> unit
val intersect : ('a,'b) map * ('a,'b) map -> unit
val intersectWith : ('b * 'b -> 'b) -> ('a,'b) map * ('a,'b) map -> unit
val intersectWithi : ('a * 'b * 'b -> 'b) -> ('a,'b) map * ('a,'b) map -> unit
val difference : ('a,'b) map * ('a,'b) map -> unit
val size : ('a,'b) map -> int
val isEmpty : ('a,'b) map -> bool
val member : ('a,'b) map * 'a -> bool
val lookup : ('a,'b) map * 'a -> 'b option
val lookupExistent : ('a,'b) map * 'a -> 'b
val choose : ('a,'b) map -> 'b option
val choosei : ('a,'b) map -> ('a * 'b) option
val equal : ('b * 'b -> bool) -> ('a,'b) map * ('a,'b) map -> bool
val submap : ('b * 'b -> bool) -> ('a,'b) map * ('a,'b) map -> bool
val disjoint : ('a,'b) map * ('a,'b) map -> bool
val app : ('b -> unit) -> ('a,'b) map -> unit
val modify : ('b -> 'b) -> ('a,'b) map -> unit
val fold : ('b * 'c -> 'c) -> 'c -> ('a,'b) map -> 'c
val all : ('b -> bool) -> ('a,'b) map -> bool
val exists : ('b -> bool) -> ('a,'b) map -> bool
val find : ('b -> bool) -> ('a,'b) map -> 'b option
val filter : ('b -> bool) -> ('a,'b) map -> unit
val appi : ('a * 'b -> unit) -> ('a,'b) map -> unit
val modifyi : ('a * 'b -> 'b) -> ('a,'b) map -> unit
val foldi : ('a * 'b * 'c -> 'c) -> 'c -> ('a,'b) map -> 'c
val alli : ('a * 'b -> bool) -> ('a,'b) map -> bool
val existsi : ('a * 'b -> bool) -> ('a,'b) map -> bool
val findi : ('a * 'b -> bool) -> ('a,'b) map -> ('a * 'b) option
val filteri : ('a * 'b -> bool) -> ('a,'b) map -> unit
end
end
Raised when a thread outgrows the maximum supported stack size (64 MB per thread in the current system). Usually, this indicates a diverging function.
Tests whether x and y are physically equal, i.e. represented by the same object in the store.
Tests whether x and y represent equal infinite trees, i.e. whether their respective graphs in the store are semantically equivalent. For example,
equiv (rec x => 1::x, rec x => 1::1::x) = true
equiv (rec x => 1::x, 1::(rec x => 1::x)) = true
equiv (rec x => (ref 1)::x, rec x => (ref 1)::x) = false
let val r = ref 1 in equiv (rec x => r::x, rec x => r::x) end = true
Note: This function may internally apply minimize to its arguments to detect equivalence.
Minimizes the store representation of x by computing the minimal representation for x that is structurally equivalent to the original.
Computes the number of futures appearing in the representation of x. For function values, this includes futures appearing in the respective closure, as well as any internal futures used in code representations (to represent not-yet-compiled code fragments, for example).
Requests all futures in the representation of x until none remain. Returns the number of futures requested. Note that for function values, this may force compilation of all not-yet-compiled code fragments.
Computes the number and total size of store nodes used to represent x. While size is hyper-strict, i.e. it requests all futures in x, sizeQuiet does not request any futures but includes the sizes of closures associated with lazy futures. Note that the size of function values includes their respective closure and code representation. Due to just-in-time compilation, the size of the latter can vary over time. Ignoring concurrent interference, the following equivalence holds:
size x = (deepWait x; sizeQuiet x)
Triggers a garbage collection up to generation gen (if the system features a generational garbage collector).
When called with SOME(limit, f), installs f as a handler that is invoked once memory consumption of the virtual machine exceeds limit bytes. Any previously installed handler will be removed. Calling signal NONE deinstalls the handler. When the handler is called the chosen limit (probably rounded) is passed as argument.
A polymorphic hash table based on physical equality. The interface to this structure is similar to imperative maps, except that the map type is also polymorphic in its key.
Note that, since the map is based on physical equality, its behaviour is implementation dependent to a certain degree. In particular, there is no guarantee that seperately constructed, but structurally equivalent values have separate physical representation. Also note that use of the minimize function may induce additional sharing. Validity of the hash table is not compromised by garbage collection, though. Store maps are considered resources and cannot be pickled.