open! Import type t = { stream : Irc.Msg.t Lwt_stream.t; push : Irc.Msg.t option -> unit; mutable bcc : t Dllist.node option; } let make () = let stream, push = Lwt_stream.create () in { stream; push; bcc = None } let stream t = t.stream let send t msg = try t.push (Some msg) with Lwt_stream.Closed -> () let close t = try t.push None with Lwt_stream.Closed -> () module Bcc = struct let _recipients = Dllist.create () let incl obx = Option.iter Dllist.remove obx.bcc; obx.bcc <- Some (Dllist.add_r obx _recipients) let excl obx = Option.iter Dllist.remove obx.bcc; obx.bcc <- None let rec send_all msg = match Dllist.take_l _recipients with | obx -> obx.bcc <- None; send obx msg; send_all msg | exception Dllist.Empty -> () end