functor (PO : Pomap_intf.PARTIAL_ORDER->
  sig
    module Store : Store_intf.STORE
    type key = PO.el
    type +'a node
    type +'a pomap
    type 'a add_find_result =
        Found of Store.Ix.t * 'a node
      | Added of Store.Ix.t * 'a node * 'a pomap
    val empty : 'a pomap
    val singleton : key -> '-> 'a pomap
    val is_empty : 'a pomap -> bool
    val cardinal : 'a pomap -> int
    val add : key -> '-> 'a pomap -> 'a pomap
    val add_node : 'a node -> 'a pomap -> 'a pomap
    val remove : key -> 'a pomap -> 'a pomap
    val remove_node : 'a node -> 'a pomap -> 'a pomap
    val remove_ix : Store.Ix.t -> 'a pomap -> 'a pomap
    val take : key -> 'a pomap -> Store.Ix.t * 'a node * 'a pomap
    val take_ix : Store.Ix.t -> 'a pomap -> 'a node * 'a pomap
    val add_find : key -> '-> 'a pomap -> 'a add_find_result
    val add_fun : key -> '-> ('-> 'a) -> 'a pomap -> 'a pomap
    val mem : key -> 'a pomap -> bool
    val mem_ix : Store.Ix.t -> 'a pomap -> bool
    val find : key -> 'a pomap -> Store.Ix.t * 'a node
    val find_ix : Store.Ix.t -> 'a pomap -> 'a node
    val choose : 'a pomap -> Store.Ix.t * 'a node
    val filter : (Store.Ix.t -> 'a node -> bool) -> 'a pomap -> 'a pomap
    val partition :
      (Store.Ix.t -> 'a node -> bool) -> 'a pomap -> 'a pomap * 'a pomap
    val iter : ('a node -> unit) -> 'a pomap -> unit
    val iteri : (Store.Ix.t -> 'a node -> unit) -> 'a pomap -> unit
    val map : ('a node -> 'b) -> 'a pomap -> 'b pomap
    val mapi : (Store.Ix.t -> 'a node -> 'b) -> 'a pomap -> 'b pomap
    val fold : ('a node -> '-> 'b) -> 'a pomap -> '-> 'b
    val foldi : (Store.Ix.t -> 'a node -> '-> 'b) -> 'a pomap -> '-> 'b
    val topo_fold : ('a node -> '-> 'b) -> 'a pomap -> '-> 'b
    val topo_foldi :
      (Store.Ix.t -> 'a node -> '-> 'b) -> 'a pomap -> '-> 'b
    val topo_fold_ix : (Store.Ix.t -> '-> 'a) -> 'b pomap -> '-> 'a
    val rev_topo_fold : ('a node -> '-> 'b) -> 'a pomap -> '-> 'b
    val rev_topo_foldi :
      (Store.Ix.t -> 'a node -> '-> 'b) -> 'a pomap -> '-> 'b
    val rev_topo_fold_ix : (Store.Ix.t -> '-> 'a) -> 'b pomap -> '-> 'a
    val chain_fold : ('a node list -> '-> 'b) -> 'a pomap -> '-> 'b
    val chain_foldi :
      ((Store.Ix.t * 'a node) list -> '-> 'b) -> 'a pomap -> '-> 'b
    val rev_chain_fold : ('a node list -> '-> 'b) -> 'a pomap -> '-> 'b
    val rev_chain_foldi :
      ((Store.Ix.t * 'a node) list -> '-> 'b) -> 'a pomap -> '-> 'b
    val union : 'a pomap -> 'a pomap -> 'a pomap
    val inter : 'a pomap -> 'a pomap -> 'a pomap
    val diff : 'a pomap -> 'a pomap -> 'a pomap
    val create_node :
      key -> '-> Store.Ix.Set.t -> Store.Ix.Set.t -> 'a node
    val get_key : 'a node -> key
    val get_el : 'a node -> 'a
    val get_sucs : 'a node -> Store.Ix.Set.t
    val get_prds : 'a node -> Store.Ix.Set.t
    val set_key : 'a node -> key -> 'a node
    val set_el : 'a node -> '-> 'a node
    val set_sucs : 'a node -> Store.Ix.Set.t -> 'a node
    val set_prds : 'a node -> Store.Ix.Set.t -> 'a node
    val get_nodes : 'a pomap -> 'a node Store.t
    val get_top : 'a pomap -> Store.Ix.Set.t
    val get_bot : 'a pomap -> Store.Ix.Set.t
    val remove_eq_prds : ('-> '-> bool) -> 'a pomap -> 'a pomap
    val fold_eq_classes :
      ('-> '-> bool) ->
      ('-> 'a pomap -> '-> 'b) -> 'a pomap -> '-> 'b
    val fold_split_eq_classes :
      ('-> '-> bool) ->
      ('-> 'a pomap -> '-> 'b) -> 'a pomap -> '-> 'b
    val preorder_eq_classes : ('-> '-> bool) -> 'a pomap -> 'a pomap list
    val topo_fold_reduced :
      ('-> '-> bool) -> ('a node -> '-> 'b) -> 'a pomap -> '-> 'b
    val unsafe_update : 'a pomap -> Store.Ix.t -> 'a node -> 'a pomap
    val unsafe_set_nodes : 'a pomap -> 'a node Store.t -> 'a pomap
    val unsafe_set_top : 'a pomap -> Store.Ix.Set.t -> 'a pomap
    val unsafe_set_bot : 'a pomap -> Store.Ix.Set.t -> 'a pomap
  end