|
@@ -27,6 +27,18 @@ let fold_var ~init ~f var comp =
|
|
|
|
|
|
(*****)
|
|
|
|
|
|
+type env =
|
|
|
+ { event_handlers : Event.handler list
|
|
|
+ ; vars : Behavior.vars }
|
|
|
+
|
|
|
+let empty_env =
|
|
|
+ { event_handlers = []
|
|
|
+ ; vars = Var_id.empty_map }
|
|
|
+
|
|
|
+let bind_event_handlers t tree =
|
|
|
+ List.iter t.event_handlers
|
|
|
+ ~f:(Tree.set_event_handler tree)
|
|
|
+
|
|
|
module type CONTEXT = sig
|
|
|
type t
|
|
|
type deleter
|
|
@@ -40,7 +52,7 @@ module type CONTEXT = sig
|
|
|
|
|
|
val create_sink
|
|
|
: t
|
|
|
- -> env:Env.t
|
|
|
+ -> env:env
|
|
|
-> tree:Tree.t
|
|
|
-> render:(Src.values -> component)
|
|
|
-> del:deleter
|
|
@@ -60,19 +72,17 @@ end
|
|
|
|
|
|
module type INST = sig
|
|
|
type ctx
|
|
|
- type deleter
|
|
|
- val inst : ctx -> Env.t -> component -> Tree.t
|
|
|
+ val inst : ctx -> env -> component -> Tree.t
|
|
|
end
|
|
|
|
|
|
module Make_inst(Ctx : CONTEXT)
|
|
|
- : INST with type ctx := Ctx.t
|
|
|
- and type deleter := Ctx.deleter =
|
|
|
+ : INST with type ctx := Ctx.t =
|
|
|
struct
|
|
|
let rec inst ctx env = function
|
|
|
| Tree(tag, comps) ->
|
|
|
let tree = Tree.create tag in
|
|
|
let () = Tree.set_children tree (List.map comps ~f:(inst ctx env)) in
|
|
|
- let () = Env.bind_event_handlers env tree in
|
|
|
+ let () = bind_event_handlers env tree in
|
|
|
tree
|
|
|
|
|
|
| Dynamic(behav) ->
|
|
@@ -86,11 +96,14 @@ struct
|
|
|
|
|
|
| Fold(init, f, make_comp) ->
|
|
|
let src = Ctx.create_source ctx ~init in
|
|
|
- let env = Env.with_event_handler env
|
|
|
- ~f:(fun evt -> Src.single_effect src (f evt)) in
|
|
|
- inst ctx env (make_comp src)
|
|
|
-
|
|
|
- | Bind(var, src, comp) ->
|
|
|
- inst ctx (Env.with_var env var src) comp
|
|
|
+ let eh evt = Src.single_effect src (f evt) in
|
|
|
+ inst ctx { env with
|
|
|
+ event_handlers = eh :: env.event_handlers }
|
|
|
+ (make_comp src)
|
|
|
+
|
|
|
+ | Bind(var_id, src_id, comp) ->
|
|
|
+ inst ctx { env with
|
|
|
+ vars = Map.set env.vars ~key:var_id ~data:src_id }
|
|
|
+ comp
|
|
|
|
|
|
end
|