Module Data.LocalSource
Functions to work with ('a, 'k) t @ local.
val wrap :
access:'k Capsule_expert.Access.t ->
'a @ local ->
('a, 'k) Capsule_expert.Data.t @ local @@ portablewrap ~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 Capsule_expert.Access.t ->
('a, 'k) Capsule_expert.Data.t @ local ->
'a @ local @@ portableunwrap ~access t returns the value of t, which lives in the capsule 'k. 'k is always the current capsule.
val wrap_unique :
access:'k Capsule_expert.Access.t ->
'a @ local portable ->
('a, 'k) Capsule_expert.Data.t @ local portable @@ portableLike wrap, but for unique values.
val unwrap_unique :
access:'k Capsule_expert.Access.t ->
('a, 'k) Capsule_expert.Data.t @ local portable ->
'a @ local portable @@ portableLike unwrap, but for unique values.
val wrap_once :
access:'k Capsule_expert.Access.t ->
'a @ local local ->
('a, 'k) Capsule_expert.Data.t @ local local @@ portableLike wrap, but for once values.
val unwrap_once :
access:'k Capsule_expert.Access.t ->
('a, 'k) Capsule_expert.Data.t @ local local ->
'a @ local local @@ portableLike unwrap, but for once values.
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 local portable ->
('a, 'k) Capsule_expert.Data.t @ local @@ portablecreate f runs f within the capsule 'k and returns a local pointer to the result of f.
val map :
password:'k Capsule_expert.Password.t @ local ->
f:('a @ local -> 'b @ local) @ local local portable ->
('a, 'k) Capsule_expert.Data.t @ local ->
('b, 'k) Capsule_expert.Data.t @ local @@ portablemap ~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) Capsule_expert.Data.t @ local ->
('b, 'k) Capsule_expert.Data.t @ local ->
('a * 'b, 'k) Capsule_expert.Data.t @ local @@ portableboth t1 t2 is a pointer to a pair of the values of t1 and t2.
val fst :
('a * 'b, 'k) Capsule_expert.Data.t @ local ->
('a, 'k) Capsule_expert.Data.t @ local @@ portablefst t gives a pointer to the first value inside t
val snd :
('a * 'b, 'k) Capsule_expert.Data.t @ local ->
('b, 'k) Capsule_expert.Data.t @ local @@ portablesnd t gives a pointer to the second value inside t
val extract :
password:'k Capsule_expert.Password.t @ local ->
f:
('a @ local -> 'b @ local portable local portable contended) @ local local portable ->
('a, 'k) Capsule_expert.Data.t @ local ->
'b @ local portable local portable contended @@ portableextract ~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.
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) Capsule_expert.Data.t @ local ->
'a @ local contended @@ portableproject 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.
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 Capsule_expert.Password.t @ local ->
f:
('a @ local -> ('b, 'j) Capsule_expert.Data.t @ local) @ local local portable ->
('a, 'k) Capsule_expert.Data.t @ local ->
('b, 'j) Capsule_expert.Data.t @ local @@ portablebind ~password ~f t is project (map ~password ~f t).
val iter :
password:'k Capsule_expert.Password.t @ local ->
f:('a @ local -> unit) @ local local portable ->
('a, 'k) Capsule_expert.Data.t @ local ->
unit @@ portableiter is extract with result type specialized to unit.
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.
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.