sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>
On This Page
The functor to generate an engine.
module Param : sig ... end
module type Perform = sig ... end
The signature of a module implementing all effect handlers for a modifier engine.
type not_found_handler = Param.context option -> Trie.bwd_path -> unit
The type of a handler of the Modifier.S.Perform.not_found
effect.
type shadow_handler =
Param.context option ->
Trie.bwd_path ->
(Param.data * Param.tag) ->
(Param.data * Param.tag) ->
Param.data * Param.tag
The type of a handler of the Modifier.S.Perform.shadow
effect.
type hook_handler =
Param.context option ->
Trie.bwd_path ->
Param.hook ->
(Param.data, Param.tag) Trie.t ->
(Param.data, Param.tag) Trie.t
The type of a handler of the Modifier.S.Perform.hook
effect.
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
modify modifier trie
runs the modifier
on the trie
and return the transformed trie.
val run :
?not_found:not_found_handler ->
?shadow:shadow_handler ->
?hook:hook_handler ->
(unit -> 'a) ->
'a
run f
initializes the engine and runs the thunk f
.
val try_with :
?not_found:not_found_handler ->
?shadow:shadow_handler ->
?hook:hook_handler ->
(unit -> 'a) ->
'a
try_with f
runs the thunk f
and intercepts modifier effects. See the documentation of run
for the meaning of the optional effect interceptors; the difference is that the default interceptors reperform the intercepted modifier effects instead of silencing them.
try_with
is intended to be used within run
to intercept or reperform effects, while run
is intended to be at the top-level to set up the environment and handle effects by itself. That is, the following is the expected program structure:
run ~not_found ~shadow ~hook @@ fun () ->
(* code *)
try_with ~not_found @@ fun () ->
(* more code *)
try_with ~shadow @@ fun () ->
(* even more code *)