sig
  type projection
  and marker
  and submarker
  and matchinghalf
  and splitmessage
  and joinmessage
  and matching = Swarm.SWARM.matchinghalf * Swarm.SWARM.matchinghalf
  and bindhalf
  and 'a resident
  and 'a bindholder
  class type notifier_type =
    object
      method get_symmetric :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf -> Swarm.SWARM.bindhalf
      method join :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.bindhalf -> Swarm.SWARM.joinmessage -> unit
      method notify : unit
      method release : Swarm.SWARM.projection -> Swarm.SWARM.bindhalf -> unit
      method split :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf -> Swarm.SWARM.splitmessage -> unit
      method transfer :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.projection -> Swarm.SWARM.bindhalf -> unit
    end
  type whichsplit = SplitFirst | SplitSecond
  and splitpart =
    Swarm.SWARM.projection ->
    Swarm.SWARM.bindhalf ->
    Swarm.SWARM.whichsplit * (Swarm.SWARM.projection * Swarm.SWARM.bindhalf)
  and joinpart =
    Swarm.SWARM.whichsplit ->
    Swarm.SWARM.projection ->
    Swarm.SWARM.bindhalf -> Swarm.SWARM.projection * Swarm.SWARM.bindhalf
  class type core =
    object ('a)
      method click : unit -> bool
      method get_full_marker : Swarm.SWARM.projection -> Swarm.SWARM.marker
      method get_projection : unit -> Swarm.SWARM.projection list
      method get_submarker :
        Swarm.SWARM.projection ->
        Swarm.SWARM.matchinghalf -> Swarm.SWARM.submarker
      method has_active : Swarm.SWARM.projection -> bool
      method is_started : unit -> bool
      method reset_notifier : unit -> unit
      method set_notifier : Swarm.SWARM.notifier_type -> unit
      method start : unit -> unit
      method stop : unit -> unit
      method tarjoin :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        '->
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.joinmessage ->
        ('a * Swarm.SWARM.projection * Swarm.SWARM.bindhalf) *
        Swarm.SWARM.joinpart
      method tarsplit :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.splitmessage ->
        ('a * Swarm.SWARM.projection * Swarm.SWARM.bindhalf) *
        ('a * Swarm.SWARM.projection * Swarm.SWARM.bindhalf) *
        Swarm.SWARM.splitpart
      method unimate_dock :
        Swarm.SWARM.projection ->
        Swarm.SWARM.matchinghalf ->
        Swarm.SWARM.submarker -> Swarm.SWARM.bindhalf
      method unimate_prop :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf -> 'Swarm.SWARM.bindholder -> unit
      method unimate_undock :
        Swarm.SWARM.projection -> Swarm.SWARM.bindhalf -> unit
      method unirelease :
        Swarm.SWARM.projection -> Swarm.SWARM.bindhalf -> unit
    end
  class base_core :
    object ('a)
      method is_started : unit -> bool
      method ngetsym :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf -> Swarm.SWARM.bindhalf
      method njoin :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.bindhalf -> Swarm.SWARM.joinmessage -> unit
      method nnotify : unit -> unit
      method nrelease :
        Swarm.SWARM.projection -> Swarm.SWARM.bindhalf -> unit
      method nsplit :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf -> Swarm.SWARM.splitmessage -> unit
      method ntransfer :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.projection -> Swarm.SWARM.bindhalf -> unit
      method reset_notifier : unit -> unit
      method set_notifier : Swarm.SWARM.notifier_type -> unit
      method start : unit -> unit
      method stop : unit -> unit
      method tarjoin :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        '->
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.joinmessage ->
        ('a * Swarm.SWARM.projection * Swarm.SWARM.bindhalf) *
        Swarm.SWARM.joinpart
      method tarsplit :
        Swarm.SWARM.projection ->
        Swarm.SWARM.bindhalf ->
        Swarm.SWARM.splitmessage ->
        ('a * Swarm.SWARM.projection * Swarm.SWARM.bindhalf) *
        ('a * Swarm.SWARM.projection * Swarm.SWARM.bindhalf) *
        Swarm.SWARM.splitpart
    end
  class type ['a] t =
    object
      constraint 'a = #Swarm.SWARM.core
      method break : unit -> unit
      method get_core : 'Swarm.SWARM.resident -> 'a
      method is_running : unit -> bool
      method list_residents : 'Swarm.SWARM.resident list
      method remove : 'Swarm.SWARM.resident -> unit
      method run : unit -> unit
      method shelter : '-> 'Swarm.SWARM.resident
      method start_all : unit -> unit
      method start_resident : 'Swarm.SWARM.resident -> unit
      method stop_all : unit -> unit
      method stop_resident : 'Swarm.SWARM.resident -> unit
      method wake : 'Swarm.SWARM.resident -> unit
    end
  val make : unit -> #Swarm.SWARM.core Swarm.SWARM.t
end