aboutsummaryrefslogtreecommitdiff
path: root/viz.js/dispatch.ml
diff options
context:
space:
mode:
Diffstat (limited to 'viz.js/dispatch.ml')
-rwxr-xr-xviz.js/dispatch.ml30
1 files changed, 30 insertions, 0 deletions
diff --git a/viz.js/dispatch.ml b/viz.js/dispatch.ml
new file mode 100755
index 0000000..42f7dc8
--- /dev/null
+++ b/viz.js/dispatch.ml
@@ -0,0 +1,30 @@
+open Js_of_ocaml
+
+type event_container =
+ E : 'a Dom.Event.typ * ('a -> unit) -> event_container
+
+type event_key = K : 'a Dom.Event.typ -> event_key
+
+type t = event_container
+
+let (catalog:event_container list ref) = ref []
+
+let register: type a. a Dom.Event.typ -> (a -> unit) -> t =
+ begin fun event callback ->
+ let handler = E (event, callback) in
+ catalog := handler::!catalog;
+ handler
+ end
+
+let remove: type a. a Dom.Event.typ -> t -> unit =
+ begin fun _event callback ->
+ catalog := List.filter (fun reg -> reg != callback) !catalog;
+ end
+
+let call: type a. a Dom.Event.typ -> a -> unit =
+ begin fun event value ->
+ List.iter (fun (E (registered_event, callback)) ->
+ if K event = K registered_event then
+ callback (Obj.magic value)
+ ) !catalog
+ end