sig
  type id = int
  type ('component_type, 'component) entity
  val new_entity : unit -> ('comp_t, 'comp) Ent.entity
  val get_id : ('comp_t, 'comp) Ent.entity -> Ent.id
  val get_id_opt : ('comp_t, 'comp) Ent.entity -> Ent.id option
  val add_component :
    ('comp_t, 'comp) Ent.entity ->
    'comp_t * 'comp -> ('comp_t, 'comp) Ent.entity
  val replace_component :
    ('comp_t, 'comp) Ent.entity ->
    'comp_t -> 'comp -> ('comp_t, 'comp) Ent.entity
  val has_component : ('comp_t, 'comp) Ent.entity -> 'comp_t -> bool
  val has_components : ('comp_t, 'comp) Ent.entity -> 'comp_t list -> bool
  val has_any_component : ('comp_t, 'comp) Ent.entity -> 'comp_t list -> bool
  val get_component : ('comp_t, 'comp) Ent.entity -> 'comp_t -> 'comp
  val get_component_opt :
    ('comp_t, 'comp) Ent.entity -> 'comp_t -> 'comp option
  val remove_component :
    ('comp_t, 'comp) Ent.entity -> 'comp_t -> ('comp_t, 'comp) Ent.entity
  val iter_components :
    ('comp_t, 'comp) Ent.entity -> ('comp_t -> 'comp -> unit) -> unit
  val get_components : ('comp_t, 'comp) Ent.entity -> 'comp_t list
  val cmp_components : ('comp_t, 'comp) Ent.entity -> 'comp_t list -> int
  val components_match : ('comp_t, 'comp) Ent.entity -> 'comp_t list -> bool
  type ('comp_t, 'comp) world
  val new_world : unit -> ('a, 'b) Ent.world
  val add_entity :
    ('a, 'b) Ent.world -> ('a, 'b) Ent.entity -> ('a, 'b) Ent.world
  val add_entities :
    ('a, 'b) Ent.world -> ('a, 'b) Ent.entity list -> ('a, 'b) Ent.world
  val add_entity_id :
    ('a, 'b) Ent.world -> ('a, 'b) Ent.entity -> ('a, 'b) Ent.world * Ent.id
  val add_entities_id :
    ('a, 'b) Ent.world ->
    ('a, 'b) Ent.entity list -> ('a, 'b) Ent.world * Ent.id list
  val add_entities_init :
    w:('a, 'b) Ent.world ->
    n:int -> f:(int -> ('a, 'b) Ent.entity) -> ('a, 'b) Ent.world
  val add_entities_ar :
    ('a, 'b) Ent.world -> ('a, 'b) Ent.entity array -> ('a, 'b) Ent.world
  val add_entities_id_ar :
    ('a, 'b) Ent.world ->
    ('a, 'b) Ent.entity array -> ('a, 'b) Ent.world * Ent.id array
  val has_entity : ('a, 'b) Ent.world -> Ent.id -> bool
  val replace_entity :
    ('a, 'b) Ent.world -> Ent.id -> ('a, 'b) Ent.entity -> ('a, 'b) Ent.world
  val remove_entity :
    ('a, 'b) Ent.world -> ('a, 'b) Ent.entity -> ('a, 'b) Ent.world
  val remove_entity_id : ('a, 'b) Ent.world -> Ent.id -> ('a, 'b) Ent.world
  val get_entity : ('a, 'b) Ent.world -> Ent.id -> ('a, 'b) Ent.entity
  val get_entity_opt :
    ('a, 'b) Ent.world -> Ent.id -> ('a, 'b) Ent.entity option
  val get_entities :
    ('a, 'b) Ent.world -> Ent.id list -> ('a, 'b) Ent.entity list
  val do_get_entities :
    ('a, 'b) Ent.world -> Ent.id list -> ('a, 'b) Ent.entity list
  val get_entities_with_components :
    ('comp_t, 'comp) Ent.world ->
    'comp_t list -> ('comp_t, 'comp) Ent.entity list
  val iter_entities :
    (('a, 'b) Ent.entity -> unit) -> ('a, 'b) Ent.world -> unit
  val fold_entities :
    (('a, 'b) Ent.entity -> '-> 'p) -> ('a, 'b) Ent.world -> '-> 'p
  val num_entities : ('a, 'b) Ent.world -> int
  val num_entities_with_components :
    ('comp_t, 'b) Ent.world -> 'comp_t list -> int
  type 'component_type mapper
  val add_mapper :
    ('comp_t, 'b) Ent.world ->
    'comp_t list -> ('comp_t, 'b) Ent.world * 'comp_t Ent.mapper
  type 'a update = Identical | Updated of '| Replace of '| Removed
  type ('comp_t, 'comp, 'delta) system =
      ('comp_t, 'comp) Ent.entity ->
      ('comp_t, 'comp) Ent.world ->
      'delta ->
      ('comp_t, 'comp) Ent.entity Ent.update *
      ('comp_t, 'comp) Ent.entity list
  type ('a, 'b, 'delta, 'fld) foldable_system =
      ('a, 'b) Ent.entity ->
      ('a, 'b) Ent.world ->
      'delta ->
      'fld ->
      ('a, 'b) Ent.entity Ent.update * ('a, 'b) Ent.entity list * 'fld
  type ('comp_t, 'comp, 'fld) born_feedback_func =
      ('comp_t, 'comp) Ent.world ->
      ('comp_t, 'comp) Ent.entity ->
      Ent.id list -> 'fld -> ('comp_t, 'comp) Ent.world * 'fld
  val world_step :
    ('a, 'b) Ent.world ->
    ('a, 'b, 'delta) Ent.system ->
    'Ent.mapper -> 'delta -> ('a, 'b) Ent.world
  val world_step_fold :
    ('a, 'b) Ent.world ->
    ('a, 'b, 'delta, 'fld) Ent.foldable_system ->
    'Ent.mapper ->
    ?fb:('a, 'b, 'fld) Ent.born_feedback_func ->
    'delta -> 'fld -> ('a, 'b) Ent.world * 'fld
end