Library
Module
Module type
Parameter
Class
Class type
The functor to generate a module for scoping effects.
module type Handler = sig ... end
The exception Locked
is raised when an operation on a scope starts before another operation on the same scope is finished. This could happen when the user, for example, calls modify_visible
and then calls modify_export
when handling the effects.
The principle is that one should not access any scope in its intermediate states, including looking up a name via resolve
. Any attempt to do so will raise the exception Locked
.
Note: section
only locks the parent scope; the child scope is initially unlocked.
val resolve : Trie.path -> (Param.data * Param.tag) option
resolve p
looks up the name p
in the current scope and return the data associated with the binding.
val include_singleton :
?context_visible:Param.context ->
?context_export:Param.context ->
(Trie.path * (Param.data * Param.tag)) ->
unit
include_singleton (p, x)
adds a new binding to both the visible and export namespaces, where the binding is associating the data x
to the path p
. Conflicting names during the final merge will trigger the effect shadow
.
val include_subtree :
?context_visible:Param.context ->
?context_export:Param.context ->
(Trie.path * (Param.data, Param.tag) Trie.t) ->
unit
include_subtree (p, ns)
merges the namespace ns
prefixed with p
into both the visible and export namespaces. Conflicting names during the final merge will trigger the effect shadow
.
val import_subtree :
?context:Param.context ->
(Trie.path * (Param.data, Param.tag) Trie.t) ->
unit
include_subtree (p, ns)
merges the namespace ns
prefixed with p
into the visible namespace (while keeping the export namespace intact). Conflicting names during the final merge will trigger the effect Mod.Shadowing
.
val modify_visible : ?context:Param.context -> Param.hook Language.t -> unit
modify_visible m
modifies the visible namespace by running the modifier m
on it, using the internal modifier engine.
val modify_export : ?context:Param.context -> Param.hook Language.t -> unit
modify_visible m
modifies the export namespace by running the modifier m
on it, using the internal modifier engine.
val modify :
?context:Param.context ->
?prefix:Trie.bwd_path ->
Param.hook Language.t ->
(Param.data, Param.tag) Trie.t ->
(Param.data, Param.tag) Trie.t
Call the internal modifier engine directly on some trie. See Modifier.S.modify
.
This will not lock the current scope.
val export_visible : ?context:Param.context -> Param.hook Language.t -> unit
export_visible m
runs the modifier m
on the visible namespace, and then merge the result into the export namespace. Conflicting names during the final merge will trigger the effect Mod.Shadowing
.
val get_export : unit -> (Param.data, Param.tag) Trie.t
get_export ()
returns the export namespace of the current scope.
val section :
?context_visible:Param.context ->
?context_export:Param.context ->
Trie.path ->
(unit -> 'a) ->
'a
section p f
starts a new scope and runs the thunk f
within the scope. The child scope inherits the visible namespace from the parent, and its export namespace will be prefixed with p
and merged into both the visible and export namespaces of the parent scope.
A handler that reperforms the internal modifier effects. See Modifier.S.Perform
.