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