sig
  type ('component_type, 'component) entity
  val new_entity : unit -> ('a, 'b) Ent.entity
  val get_id : ('a, 'b) Ent.entity -> int
  val get_id_opt : ('a, 'b) Ent.entity -> int option
  val add_component :
    ('component_type, 'component) Ent.entity ->
    'component_type * 'component -> ('component_type, 'component) Ent.entity
  val replace_component :
    ('component_type, 'component) Ent.entity ->
    'component_type -> 'component -> ('component_type, 'component) Ent.entity
  val has_component :
    ('component_type, 'component) Ent.entity -> 'component_type -> bool
  val get_component :
    ('component_type, 'component) Ent.entity -> 'component_type -> 'component
  val get_component_opt :
    ('component_type, 'component) Ent.entity ->
    'component_type -> 'component option
  type ('a, 'b) world
  type delta = float
  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 * int
  val world_step : ('a, 'b) Ent.world -> Ent.delta -> ('a, 'b) Ent.world
  val iter_entities :
    (('a, 'b) Ent.entity -> unit) -> ('a, 'b) Ent.world -> unit
  val fold_entities :
    (('a, 'b) Ent.entity -> '-> 'c) -> ('a, 'b) Ent.world -> '-> 'c
  val num_entities : ('a, 'b) Ent.world -> int
  val get_entity : ('a, 'b) Ent.world -> int -> ('a, 'b) Ent.entity
  val get_entity_opt :
    ('a, 'b) Ent.world -> int -> ('a, 'b) Ent.entity option
  type 'a update = Updated of '| Unchanged | Removed
  type ('a, 'b) system =
      ('a, 'b) Ent.entity ->
      ('a, 'b) Ent.world ->
      Ent.delta -> ('a, 'b) Ent.entity Ent.update * ('a, 'b) Ent.entity list
  val add_system :
    ('a, 'b) Ent.world -> ('a, 'b) Ent.system -> ('a, 'b) Ent.world
end