open Types type 'a transition = { new_state : 'a; broadcasts : protocol_msg list; events : node_event list; } val no_change : 'a -> 'a transition val node_id_of_msg : protocol_msg -> node_id val incarnation_of_msg : protocol_msg -> incarnation option val handle_alive : self:node_id -> member_snapshot -> protocol_msg -> now:Mtime.span -> member_snapshot transition val handle_suspect : self:node_id -> member_snapshot -> protocol_msg -> now:Mtime.span -> member_snapshot transition val handle_dead : member_snapshot -> protocol_msg -> now:Mtime.span -> member_snapshot transition val suspicion_timeout : config -> node_count:int -> float val retransmit_limit : config -> node_count:int -> int val next_probe_target : self:node_id -> probe_index:int -> members:node_info list -> (node_info * int) option val invalidates : newer:protocol_msg -> older:protocol_msg -> bool val merge_member_state : local:member_snapshot -> remote:member_snapshot -> member_snapshot val select_indirect_targets : self:node_id -> exclude:node_id -> count:int -> members:node_info list -> node_info list