Source

core hello world / directory.ml

open Core.Std
open Async.Std
open Broker_protocol

(* A publisher for a single topic *)
module Topic_pub : sig
  type t
  val create : Message.t -> t
  val publish : t -> Message.t -> unit
  val subscribe : t -> Message.t Pipe.Reader.t
  val num_subscribers : t -> int
  val last_message : t -> Message.t
end = struct
  type t = { mutable last_message: Message.t;
             mutable subscribers: Message.t Pipe.Writer.t list;
           }
  with fields

  let create last_message =
    { last_message; subscribers = [] }

  let clear_closed t =
    t.subscribers <-
      List.filter t.subscribers ~f:(fun pipe ->
        not (Pipe.is_closed pipe))

  let publish t msg =
    clear_closed t;
    t.last_message <- msg;
    List.iter t.subscribers ~f:(fun pipe ->
      don't_wait_for (Pipe.write pipe msg))

  let subscribe t =
    let (r,w) = Pipe.create () in
    don't_wait_for (Pipe.write w t.last_message);
    t.subscribers <- w :: t.subscribers;
    r

  let num_subscribers t = List.length t.subscribers
end

type t = (Topic.t, Topic_pub.t) Hashtbl.t

let create () = Topic.Table.create ()

let publish t message =
  let s =
    Hashtbl.find_or_add t message.Message.topic
      ~default:(fun () -> Topic_pub.create message)
  in
  Topic_pub.publish s message

let subscribe t topic =
  Option.map (Hashtbl.find t topic) ~f:Topic_pub.subscribe

let dump t =
  Hashtbl.data t
  |> List.map ~f:(fun tpub ->
    let num_subscribers = Topic_pub.num_subscribers tpub in
    let message = Topic_pub.last_message tpub in
    {Dump. num_subscribers; message })
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.