aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Emilio Jesus Gallego Arias <e+git@x80.org>2016-09-30 19:58:06 +0200
committerGravatar Emilio Jesus Gallego Arias <e+git@x80.org>2017-03-21 15:47:14 +0100
commiteb68e001f2ebbf09dc32c999e9c9b0f116c0a530 (patch)
tree667f8e49f9d027ebc41ae1faf0a0c14931b4c837
parent7440be4ffaf6ace5b8e94354c9a56462f45fa2dd (diff)
[feedback] Allow to remove feedback listeners.
-rw-r--r--lib/feedback.ml13
-rw-r--r--lib/feedback.mli7
2 files changed, 15 insertions, 5 deletions
diff --git a/lib/feedback.ml b/lib/feedback.ml
index 971a51e35..852eec2f2 100644
--- a/lib/feedback.ml
+++ b/lib/feedback.ml
@@ -180,8 +180,15 @@ let msg_error ?loc x = !logger ?loc Error x
let msg_debug ?loc x = !logger ?loc Debug x
(** Feeders *)
-let feeders = ref []
-let add_feeder f = feeders := f :: !feeders
+let feeders : (int, feedback -> unit) Hashtbl.t = Hashtbl.create 7
+
+let add_feeder =
+ let f_id = ref 0 in fun f ->
+ incr f_id;
+ Hashtbl.add feeders !f_id f;
+ !f_id
+
+let del_feeder fid = Hashtbl.remove feeders fid
let debug_feeder = function
| { contents = Message (Debug, loc, pp) } ->
@@ -200,7 +207,7 @@ let feedback ?id ?route what =
route = Option.default !feedback_route route;
id = Option.default !feedback_id id;
} in
- List.iter (fun f -> f m) !feeders
+ Hashtbl.iter (fun _ f -> f m) feeders
let feedback_logger ?loc lvl msg =
feedback ~route:!feedback_route ~id:!feedback_id
diff --git a/lib/feedback.mli b/lib/feedback.mli
index b4bed8793..8eae31588 100644
--- a/lib/feedback.mli
+++ b/lib/feedback.mli
@@ -79,8 +79,11 @@ val feedback_logger : logger
val emacs_logger : logger
-(** [add_feeder] feeders observe the feedback *)
-val add_feeder : (feedback -> unit) -> unit
+(** [add_feeder f] adds a feeder listiner [f], returning its id *)
+val add_feeder : (feedback -> unit) -> int
+
+(** [del_feeder fid] removes the feeder with id [fid] *)
+val del_feeder : int -> unit
(** Prints feedback messages of kind Message(Debug,_) using msg_debug *)
val debug_feeder : feedback -> unit