Module Data.Local

Functions to work with ('a, 'k) t @ local.

val wrap : access:'k Access.t -> 'a @ local -> ('a, 'k) t @ local @@ portable

wrap ~access v returns a pointer to the local value v, which lives in the capsule 'k. 'k is always the current capsule.

val unwrap : access:'k Access.t -> ('a, 'k) t @ local -> 'a @ local @@ portable

unwrap ~access t returns the value of t, which lives in the capsule 'k. 'k is always the current capsule.

val wrap_unique : access:'k Access.t -> 'a @ local unique -> ('a, 'k) t @ local unique @@ portable

Like wrap, but for unique values.

val unwrap_unique : access:'k Access.t -> ('a, 'k) t @ local unique -> 'a @ local unique @@ portable

Like unwrap, but for unique values.

val wrap_once : access:'k Access.t -> 'a @ local once -> ('a, 'k) t @ local once @@ portable

Like wrap, but for once values.

val unwrap_once : access:'k Access.t -> ('a, 'k) t @ local once -> 'a @ local once @@ portable

Like unwrap, but for once values.

val unwrap_shared : 'a 'k. access:'k Access.t @ shared -> ('a, 'k) t @ local -> 'a @ local shared @@ portable

unwrap_shared ~access t returns the shared value of t, which lives in the capsule 'k. 'k is always the current capsule. Since 'a may have been shared with other threads, 'a must cross portability.

val create : (unit -> 'a @ local) @ local once portable -> ('a, 'k) t @ local @@ portable

create f runs f within the capsule 'k and returns a local pointer to the result of f.

val map : password:'k Password.t @ local -> (f:('a @ local -> 'b @ local) @ local once portable -> (('a, 'k) t @ local -> ('b, 'k) t @ local) @ local once) @ local @@ portable

map ~password ~f t applies f to the value of p within the capsule 'k and returns a local pointer to the result.

val both : ('a, 'k) t @ local -> (('b, 'k) t @ local -> ('a * 'b, 'k) t @ local) @ local @@ portable

both t1 t2 is a pointer to a pair of the values of t1 and t2.

val fst : ('a * 'b, 'k) t @ local -> ('a, 'k) t @ local @@ portable

fst t gives a pointer to the first value inside t

val snd : ('a * 'b, 'k) t @ local -> ('b, 'k) t @ local @@ portable

snd t gives a pointer to the second value inside t

val extract : password:'k Password.t @ local -> (f: ('a @ local -> 'b @ local unique once portable contended) @ local once portable -> (('a, 'k) t @ local -> 'b @ local unique once portable contended) @ local once) @ local @@ portable

extract ~password ~f t applies f to the value of t within the capsule 'k and returns the result. The result is within 'k so must be portable and is marked contended.

val inject : 'a 'k. 'a @ local portable -> ('a, 'k) t @ local @@ portable

inject v is a pointer to an value v injected into the capsule 'k. It's a specialization of create to values that are always uncontended.

val project : 'a 'k. ('a, 'k) t @ local -> 'a @ local contended @@ portable

project t returns the value of t. The result is within 'k, so must be portable and is marked contended. Since it's always portable, unlike with extract, we don't need exclusive access to 'k: all accesses to the value happen only after it's marked contended.

val project_shared : 'a 'k. key:'k Key.t @ local -> (('a, 'k) t @ local -> 'a @ local shared) @ local @@ portable

project_shared ~key t is like project t, but since t is a capsule associated with a key @ aliased global, the contents can be returned at shared.

val bind : password:'k Password.t @ local -> (f:('a @ local -> ('b, 'j) t @ local) @ local once portable -> (('a, 'k) t @ local -> ('b, 'j) t @ local) @ local once) @ local @@ portable

bind ~password ~f t is project (map ~password ~f t).

val iter : password:'k Password.t @ local -> (f:('a @ local -> unit) @ local once portable -> (('a, 'k) t @ local -> unit) @ local once) @ local @@ portable

iter is extract with result type specialized to unit.

val map_shared : 'a 'b 'k. password:'k Password.Shared.t @ local -> (f:('a @ local shared -> 'b @ local) @ local once portable -> (('a, 'k) t @ local -> ('b, 'k) t @ local) @ local once) @ local @@ portable

map_shared ~password ~f t applies f to the shared parts of t within the capsule 'k and returns a pointer to the result. Since 'a may have been shared with other threads, 'a must cross portability.

val extract_shared : 'a 'b 'k. password:'k Password.Shared.t @ local -> (f: ('a @ local shared -> 'b @ local unique once portable contended) @ local once portable -> (('a, 'k) t @ local -> 'b @ local unique once portable contended) @ local once) @ local @@ portable

extract_shared ~password ~f t applies f to the shared parts of t within the capsule 'k and returns the result. The result is within 'k so must be portable and is marked contended. Since 'a may have been shared with other threads, 'a must cross portability.