sig
  val ident_packed : Ident.t
  module Graph :
    sig
      type key = Oug_types.elt_id
      type edge_data = Oug_types.depend
      type t
      val create : unit -> t
      val marshal : t -> string
      val unmarshal : string -> t
      val succ : t -> key -> (key * edge_data) list
      val pred : t -> key -> (key * edge_data) list
      val add : t -> key * key * edge_data -> t
      val rem : t -> key * key -> (edge_data -> bool) -> t
      val rem_all : t -> key * key -> t
      val isolate : t -> key -> t
      val remove_node : t -> key -> t
      val pred_roots : ?ignore_deps:edge_data list -> t -> key list
      val succ_roots : t -> key list
      val recursive_succs : t -> ?pred:(edge_data -> bool) -> key -> key list
      val recursive_preds : t -> ?pred:(edge_data -> bool) -> key -> key list
      val reverse : t -> t
      val fold_succ :
        t -> (key -> (key * edge_data) list -> '-> 'a) -> '-> 'a
      val fold_pred :
        t -> (key -> (key * edge_data) list -> '-> 'a) -> '-> 'a
      val iter_succ : t -> (key -> (key * edge_data) list -> unit) -> unit
      val iter_pred : t -> (key -> (key * edge_data) list -> unit) -> unit
      val dot_of_graph :
        ?f_edge:(edge_data -> string * (string * string) list) ->
        f_node:(key -> string * string * (string * string) list) ->
        t -> string
      val nodes_by_pred_order : t -> key list
      val shortest_path :
        t ->
        (t -> key * key -> (float * edge_data) option) ->
        key * key -> (key * edge_data * key) list
    end
  module Elt_map :
    sig
      type key = Oug_types.elt_id
      type 'a t = 'Oug_types.Elt_map.t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val add : key -> '-> 'a t -> 'a t
      val singleton : key -> '-> 'a t
      val remove : key -> 'a t -> 'a t
      val merge :
        (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
      val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val for_all : (key -> '-> bool) -> 'a t -> bool
      val exists : (key -> '-> bool) -> 'a t -> bool
      val filter : (key -> '-> bool) -> 'a t -> 'a t
      val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val max_binding : 'a t -> key * 'a
      val choose : 'a t -> key * 'a
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val map : ('-> 'b) -> 'a t -> 'b t
      val mapi : (key -> '-> 'b) -> 'a t -> 'b t
    end
  type t = {
    mod_name : string;
    mod_intf : bool option;
    mod_elts : Oug_types.elt_map;
    mod_pending : (string * Oug_actions.pending_action) list;
    mod_env : Oug_types.elt_id Oug_env.t;
    mod_elt_env : Oug_types.elt_id Oug_env.t Oug_mod.Elt_map.t;
    mod_elt_intf :
      (Oug_types.elt_id Oug_env.Interface.t *
       (string * Oug_types.elt_id) list)
      Oug_mod.Elt_map.t;
    mod_graph : Oug_mod.Graph.t;
    mod_groups : (unit, Oug_types.Elt_set.t) Oug_tmap.t;
    mod_cur_name : Oug_types.absname;
    mod_cur_id : Oug_types.elt_id;
  }
  val create : Oug_loc.location -> bool option -> string -> Oug_mod.t
  val size : Oug_mod.t -> int * int
  val input_file : string -> Oug_mod.t
  val output_file : string -> Oug_mod.t -> unit
  val dummy_t : Oug_mod.t
  val get_elt : Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt
  val get_elt_env :
    Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt_id Oug_env.t
  val set_elt_env :
    Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt_id Oug_env.t -> Oug_mod.t
  val get_elt_intf :
    Oug_mod.t ->
    Oug_types.elt_id ->
    Oug_types.elt_id Oug_env.Interface.t * (string * Oug_types.elt_id) list
  val set_elt_intf :
    Oug_mod.t ->
    Oug_types.elt_id ->
    Oug_types.elt_id Oug_env.Interface.t * (string * Oug_types.elt_id) list ->
    Oug_mod.t
  val add_depend :
    Oug_mod.t ->
    src:Oug_types.elt_id ->
    data:Oug_types.depend -> dst:Oug_types.elt_id -> Oug_mod.t
  val elt_alias_dst : Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt_id list
  val get_export_final : Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt_id
  val elt_set : Oug_mod.t -> Oug_types.Elt_set.t
  val add_val :
    Oug_mod.t ->
    Oug_loc.location ->
    ?inst_var:bool ->
    ?group:Oug_types.group_id ->
    Oug_types.absname -> Oug_types.elt_id * Oug_mod.t
  val add_pattern :
    Oug_mod.t ->
    Oug_loc.location ->
    ?group:Oug_types.group_id ->
    Oug_types.absname -> Oug_types.elt_id * Oug_mod.t
  val copy_val_or_pattern :
    Oug_mod.t ->
    Oug_types.elt_id -> Oug_types.absname -> Oug_types.elt_id * Oug_mod.t
  val add_expr :
    Oug_mod.t ->
    Oug_loc.location ->
    ?group:Oug_types.group_id ->
    ?kind:Oug_types.expr_kind -> string -> Oug_types.elt_id * Oug_mod.t
  val copy_expr :
    Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt_id * Oug_mod.t
  val add_module :
    ?contain:bool ->
    Oug_mod.t ->
    Oug_loc.location ->
    Oug_types.elt_id Oug_env.t ->
    Oug_types.absname -> Oug_types.elt_id * Oug_mod.t
  val add_module_to_env :
    Oug_mod.t ->
    intf:Oug_types.elt_id Oug_env.Interface.t ->
    ?args:(string * Oug_types.elt_id) list ->
    string -> Oug_types.elt_id -> Oug_mod.t
  val add_type_field :
    Oug_mod.t ->
    Oug_loc.location ->
    Oug_types.elt_id Oug_env.t ->
    Oug_types.absname -> Oug_types.elt_id * Oug_mod.t
  val add_type :
    Oug_mod.t ->
    ?group:Oug_types.group_id ->
    Oug_loc.location ->
    Oug_types.absname -> Oug_types.type_kind -> Oug_types.elt_id * Oug_mod.t
  val add_type_with_env_kind :
    Oug_mod.t ->
    ?group:Oug_types.group_id ->
    Oug_loc.location ->
    Oug_types.absname ->
    Oug_types.elt_id Oug_env.type_kind -> Oug_types.elt_id * Oug_mod.t
  val copy_type :
    Oug_mod.t ->
    '->
    Oug_types.absname ->
    Oug_types.elt_id Oug_env.type_kind -> Oug_types.elt_id * Oug_mod.t
  val add_method :
    Oug_mod.t ->
    Oug_loc.location -> Oug_types.absname -> Oug_types.elt_id * Oug_mod.t
  val copy_method :
    Oug_mod.t -> '-> Oug_types.absname -> Oug_types.elt_id * Oug_mod.t
  val add_group : Oug_mod.t -> unit Oug_tmap.key * Oug_mod.t
  val set_group :
    Oug_mod.t -> unit Oug_tmap.key -> Oug_types.Elt_set.t -> Oug_mod.t
  val add_pending :
    Oug_mod.t -> string -> Oug_actions.pending_action -> Oug_mod.t
  val map_pending_action_ids :
    (Oug_types.elt_id -> Oug_types.elt_id) ->
    'a * Oug_actions.pending_action -> 'a * Oug_actions.pending_action
  val ids_in_pending_action :
    Oug_actions.pending_action -> Oug_types.elt_id list
  val ids_in_pending_actions : Oug_mod.t -> Oug_types.Elt_set.t
  val find_and_add_depend_to_value :
    Oug_mod.t ->
    Oug_types.elt_id -> Oug_types.depend -> Oug_types.absname -> Oug_mod.t
  val find_and_add_depend_to_type :
    Oug_mod.t ->
    Oug_types.elt_id -> Oug_types.depend -> Oug_types.absname -> Oug_mod.t
  val string_of_mod_elt : Oug_mod.t -> Oug_types.elt_id -> string
  val string_of_action : Oug_mod.t -> Oug_actions.pending_action -> string
  val string_of_pending : Oug_mod.t -> string
  val string_of_one_elt_intf : Oug_mod.t -> Oug_types.elt_id -> string
  val string_of_elt_intf : Oug_mod.t -> string
  val string_of_one_elt_env : Oug_mod.t -> Oug_types.elt_id -> string
  val string_of_elt_env : Oug_mod.t -> string
  val fold_on_packed_modules :
    (Oug_mod.t ->
     Oug_types.elt_id -> Oug_types.elt_id Oug_env.Interface.t -> Oug_mod.t) ->
    Oug_mod.t -> Oug_types.elt_id -> Oug_mod.t
  val fold_contained :
    ?recu:bool ->
    '->
    ('-> '-> ('b * Oug_types.depend) list) ->
    ('-> '-> 'c) -> '-> '-> 'c
  val container : Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt_id option
  val succ_by_kinds :
    Oug_mod.t ->
    Oug_types.elt_id ->
    Oug_types.depend list -> (Oug_types.elt_id * Oug_types.depend) list
  val replace_in_actions :
    Oug_types.elt_id ->
    Oug_types.elt_id list ->
    ('a * Oug_actions.pending_action) list ->
    ('a * Oug_actions.pending_action) list
  val filter_actions :
    (string * Oug_actions.pending_action -> bool) -> Oug_mod.t -> Oug_mod.t
  val add_reversed_use_where_contain : Oug_mod.t -> Oug_mod.t
  val gather_sub_exps :
    Oug_mod.t ->
    Oug_loc.location ->
    ?force:bool ->
    ?kind:Oug_types.expr_kind ->
    string -> Oug_types.elt_id list -> Oug_types.elt_id option * Oug_mod.t
  val gather_sub_exps_opt :
    Oug_mod.t ->
    Oug_loc.location ->
    ?force:bool ->
    string ->
    Oug_types.elt_id option list -> Oug_types.elt_id option * Oug_mod.t
  module Mod_dep :
    sig
      type key = string * bool
      type edge_data = unit
      type t
      val create : unit -> t
      val marshal : t -> string
      val unmarshal : string -> t
      val succ : t -> key -> (key * edge_data) list
      val pred : t -> key -> (key * edge_data) list
      val add : t -> key * key * edge_data -> t
      val rem : t -> key * key -> (edge_data -> bool) -> t
      val rem_all : t -> key * key -> t
      val isolate : t -> key -> t
      val remove_node : t -> key -> t
      val pred_roots : ?ignore_deps:edge_data list -> t -> key list
      val succ_roots : t -> key list
      val recursive_succs : t -> ?pred:(edge_data -> bool) -> key -> key list
      val recursive_preds : t -> ?pred:(edge_data -> bool) -> key -> key list
      val reverse : t -> t
      val fold_succ :
        t -> (key -> (key * edge_data) list -> '-> 'a) -> '-> 'a
      val fold_pred :
        t -> (key -> (key * edge_data) list -> '-> 'a) -> '-> 'a
      val iter_succ : t -> (key -> (key * edge_data) list -> unit) -> unit
      val iter_pred : t -> (key -> (key * edge_data) list -> unit) -> unit
      val dot_of_graph :
        ?f_edge:(edge_data -> string * (string * string) list) ->
        f_node:(key -> string * string * (string * string) list) ->
        t -> string
      val nodes_by_pred_order : t -> key list
      val shortest_path :
        t ->
        (t -> key * key -> (float * edge_data) option) ->
        key * key -> (key * edge_data * key) list
    end
  val build_mod_deps : Oug_mod.t list -> Oug_mod.Mod_dep.t
  val dep_sort_modules : Oug_mod.t list -> Oug_mod.t list
  val reduce_graph :
    ?progress:(Oug_mod.t -> 'a) ->
    Oug_mod.t ->
    Oug_types.depend list ->
    ?edge_map:(Oug_types.depend -> Oug_types.depend -> Oug_types.depend) ->
    (Oug_mod.t -> Oug_types.elt_id -> Oug_types.elt -> bool) -> Oug_mod.t
  val reduce_expressions : Oug_mod.t -> Oug_mod.t
  val reduce_aliases : ?progress:(Oug_mod.t -> 'a) -> Oug_mod.t -> Oug_mod.t
end