sig
  type ('a, 'b) node = ('a, 'b) BiDirectionalLabeledTree.node
  and ('a, 'b) incoming_edge =
    ('a, 'b) BiDirectionalLabeledTree.incoming_edge
  val get_node_label : ('a, 'b) node -> 'a
  val get_parent_edge : ('a, 'b) node -> ('a, 'b) incoming_edge option
  val get_children : ('a, 'b) node -> ('a, 'b) node list
  val get_edge_label : ('a, 'b) incoming_edge -> 'b
  val get_source : ('a, 'b) incoming_edge -> ('a, 'b) node
  val get_parent : ('a, 'b) node -> ('a, 'b) node
  val set_node_label : ('a, 'b) node -> '-> unit
  val set_edge_label : ('a, 'b) incoming_edge -> '-> unit
  val has_parent : ('a, 'b) node -> bool
  val has_child : ('a, 'b) node -> bool
  val create_root : '-> ('a, 'b) node
  val create_child : '-> '-> ('a, 'b) node -> ('a, 'b) node
  val delete_children : ('a, 'b) node -> unit
  val delete_child : ('a, 'b) node -> unit
  val iter_descendants : ('-> unit) -> ('a, 'b) node -> unit
  val iter_ancestors : ('-> unit) -> ('a, 'b) node -> unit
  val fold_left_descendants : ('-> '-> 'a) -> '-> ('b, 'c) node -> 'a
  val fold_left_ancestors : ('-> '-> 'a) -> '-> ('b, 'c) node -> 'a
  val fold_right_descendants : ('-> '-> 'b) -> ('a, 'c) node -> '-> 'b
  val fold_right_ancestors : ('-> '-> 'b) -> ('a, 'c) node -> '-> 'b
  val count_nodes_descendants : ('a, 'b) node -> int
  val count_f_descendants : (('a, 'b) node -> bool) -> ('a, 'b) node -> int
  val node_depth : ('a, 'b) node -> int
  val path_to_root : ('a, 'b) node -> ('a, 'b) node list
  val subtree_depth : ('a, 'b) node -> int
  val traverse_bfs :
    (('a, 'b) node -> unit) ->
    (('a, 'b) node -> unit) -> ('a, 'b) node -> unit
end