diff options
author | Emilio Jesus Gallego Arias <e+git@x80.org> | 2016-09-30 19:58:06 +0200 |
---|---|---|
committer | Emilio Jesus Gallego Arias <e+git@x80.org> | 2017-03-21 15:47:14 +0100 |
commit | eb68e001f2ebbf09dc32c999e9c9b0f116c0a530 (patch) | |
tree | 667f8e49f9d027ebc41ae1faf0a0c14931b4c837 | |
parent | 7440be4ffaf6ace5b8e94354c9a56462f45fa2dd (diff) |
[feedback] Allow to remove feedback listeners.
-rw-r--r-- | lib/feedback.ml | 13 | ||||
-rw-r--r-- | lib/feedback.mli | 7 |
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 |