module Flat_array:sig..end
    A flat tuple is like an ordinary OCaml tuple, except it is second class and mutable.
    The flat tuples in a Flat_array.t are layed out sequentially in a single array, with
    each flat tuple's components immediately following the components of the prior flat
    tuple.  A flat tuple is not first class -- one can only refer to a flat tuple via its
    index in the array holding it.  Flat tuples are mutable via Flat_array.set.
module Slots:Tuple_type.Slots
module Slot:Tuple_type.Slot
type 'slots t 
'slots will look like ('a1, ..., 'an) Slots.tn,
    and the array holds flat tuples of type 'a1 * ... * 'an.include Blit.S1
include Invariant.S1
val create : ('tuple, 'a) Slots.t ->
       len:int -> 'tuple -> ('tuple, 'a) Slots.t tcreate slots ~len init creates an array of flat tuples, whose slots are initialized
    to the slots of init, which is an ordinary OCaml tuple.  create raises if len <
    0.val copy : 'slots t -> 'slots tcopy a returns a shallow copy of a, that is, a fresh array containing the same
    elements as a.val length : 'a t -> intval slots : 'slots t -> 'slotsval get : ('b, 'v) Slots.t t -> int -> ('v, 'a) Slot.t -> 'ai in array t.
    It is required that 0 <= i < length t.
val unsafe_get : ('b, 'v) Slots.t t -> int -> ('v, 'a) Slot.t -> 'aval set : ('b, 'v) Slots.t t -> int -> ('v, 'a) Slot.t -> 'a -> unitval unsafe_set : ('b, 'v) Slots.t t -> int -> ('v, 'a) Slot.t -> 'a -> unitval set_to_init : 'a t -> int -> unitset_to_init t i sets flat tuple i to the init that was supplied to create.val is_init : 'a t -> int -> boolis_init t i returns true iff flat tuple i's slots are identical to those of
    the init supplied to create.val get_all_slots : ('tuple, 'a) Slots.t t -> int -> 'tupleget_all_slots t i allocates a new ordinary OCaml tuple whose components are equal to
    the slots of the flat tuple at index i of t.  This is esentially an allocation
    plus a blit from t to the newly allocated tuple.
    set_all_slots t i tuple sets all slots of the flat tuple at index i of t to
    their corresponding components of tuple.  This is essentially a blit from tuple to
    t.
    It is required that 0 <= i < length t.
val set_all_slots : ('tuple, 'a) Slots.t t -> int -> 'tuple -> unitval sexp_of_t : ('slots -> Sexplib.Sexp.t) -> 'slots t -> Sexplib.Sexp.tcreate slots ~len init creates an array of flat tuples, whose slots are initialized
    to the slots of init, which is an ordinary OCaml tuple.  create raises if len <
    0.copy a returns a shallow copy of a, that is, a fresh array containing the same
    elements as a.i in array t.
    It is required that 0 <= i < length t.
set_to_init t i sets flat tuple i to the init that was supplied to create.
is_init t i returns true iff flat tuple i's slots are identical to those of
    the init supplied to create.
get_all_slots t i allocates a new ordinary OCaml tuple whose components are equal to
    the slots of the flat tuple at index i of t.  This is esentially an allocation
    plus a blit from t to the newly allocated tuple.
    set_all_slots t i tuple sets all slots of the flat tuple at index i of t to
    their corresponding components of tuple.  This is essentially a blit from tuple to
    t.
    It is required that 0 <= i < length t.