# Module type Tuple_type.Slots

    module type Slots = Tuple_type_intf.Slots

`Slots` has types `t1`, ..., `t12` of arities 1 to 12 that are isomorphic to tuple types of the corresponding arities. Type `('a0, ..., 'a<N-1>) t<N>` corresponds to `'a0 * ... * 'a<N-1>`.

Each type `ti` is an instance of type `('tuple, 'variant) t`, in which `'tuple` is the tuple type `'a0 * ... * 'a<N-1>` and `'variant` is an encoding of the tuple type in the form: `[ `S0 of `a0 | `S1 of `a1 | ... | `S<N-1> of `a<N-1> ]`.

The encoding of the slots using a polymorphic variant allows one to write functions that are polymorphic in the tuple type, and require that a tuple have a certain slot, but allow more slots.

We make `t` itself a polymorphic variant type so that one can easily encode cyclic types, e.g. lists, like:

            type 'a slots = ('a, 'a slots Pointer.t) Slots.t2

Observe that `slots` in the above is cyclic, but that OCaml allows it because the definition expands to:

            type 'a slots = [ `Slots of ('a * 'a slots Pointer.t,
                                         [ `S0 of 'a
                                         | `S1 of 'a slots Pointer.t
                                         ]
                                        ) u
                            ]

Ultimately, a `Slots.t` is used as a phantom type that ensures consistent usage of the tuples in the data structure containing them.

    type ('tuple, 'variant) u

    type ('tuple, 'variant) t = [ `Slots of ('tuple, 'variant) u ]

    val slots_per_tuple : ('a, 'b) t -> int

    type 'a0 t1 = ('a0, [ `S0 of 'a0 ]) t

    type ('a0, 'a1) t2 = ('a0 * 'a1, [ `S0 of 'a0 | `S1 of 'a1 ]) t

    type ('a0, 'a1, 'a2) t3 = ('a0 * 'a1 * 'a2, [ `S0 of 'a0 | `S1 of 'a1 | `S2 of 'a2 ])
           t

    type ('a0, 'a1, 'a2, 'a3) t4 = ('a0 * 'a1 * 'a2 * 'a3,
            [ `S0 of 'a0 | `S1 of 'a1 | `S2 of 'a2 | `S3 of 'a3 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4) t5 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4,
            [ `S0 of 'a0 | `S1 of 'a1 | `S2 of 'a2 | `S3 of 'a3 | `S4 of 'a4 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4, 'a5) t6 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4 * 'a5,
            [ `S0 of 'a0
            | `S1 of 'a1
            | `S2 of 'a2
            | `S3 of 'a3
            | `S4 of 'a4
            | `S5 of 'a5 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6) t7 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4 * 'a5 * 'a6,
            [ `S0 of 'a0
            | `S1 of 'a1
            | `S2 of 'a2
            | `S3 of 'a3
            | `S4 of 'a4
            | `S5 of 'a5
            | `S6 of 'a6 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7) t8 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4 * 'a5 * 'a6 * 'a7,
            [ `S0 of 'a0
            | `S1 of 'a1
            | `S2 of 'a2
            | `S3 of 'a3
            | `S4 of 'a4
            | `S5 of 'a5
            | `S6 of 'a6
            | `S7 of 'a7 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8) t9 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4 * 'a5 * 'a6 * 'a7 * 'a8,
            [ `S0 of 'a0
            | `S1 of 'a1
            | `S2 of 'a2
            | `S3 of 'a3
            | `S4 of 'a4
            | `S5 of 'a5
            | `S6 of 'a6
            | `S7 of 'a7
            | `S8 of 'a8 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8, 'a9) t10 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4 * 'a5 * 'a6 * 'a7 * 'a8 * 'a9,
            [ `S0 of 'a0
            | `S1 of 'a1
            | `S2 of 'a2
            | `S3 of 'a3
            | `S4 of 'a4
            | `S5 of 'a5
            | `S6 of 'a6
            | `S7 of 'a7
            | `S8 of 'a8
            | `S9 of 'a9 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8, 'a9, 'a10) t11 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4 * 'a5 * 'a6 * 'a7 * 'a8 * 'a9 * 'a10,
            [ `S0 of 'a0
            | `S1 of 'a1
            | `S10 of 'a10
            | `S2 of 'a2
            | `S3 of 'a3
            | `S4 of 'a4
            | `S5 of 'a5
            | `S6 of 'a6
            | `S7 of 'a7
            | `S8 of 'a8
            | `S9 of 'a9 ])
           t

    type ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8, 'a9, 'a10, 'a11) t12 = ('a0 * 'a1 * 'a2 * 'a3 * 'a4 * 'a5 * 'a6 * 'a7 * 'a8 * 'a9 * 'a10 * 'a11,
            [ `S0 of 'a0
            | `S1 of 'a1
            | `S10 of 'a10
            | `S11 of 'a11
            | `S2 of 'a2
            | `S3 of 'a3
            | `S4 of 'a4
            | `S5 of 'a5
            | `S6 of 'a6
            | `S7 of 'a7
            | `S8 of 'a8
            | `S9 of 'a9 ])
           t

    val t1 : 'a t1

    val t2 : ('a, 'b) t2

    val t3 : ('a, 'b, 'c) t3

    val t4 : ('a, 'b, 'c, 'd) t4

    val t5 : ('a, 'b, 'c, 'd, 'e) t5

    val t6 : ('a, 'b, 'c, 'd, 'e, 'f) t6

    val t7 : ('a, 'b, 'c, 'd, 'e, 'f, 'g) t7

    val t8 : ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h) t8

    val t9 : ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i) t9

    val t10 : ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j) t10

    val t11 : ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k) t11

    val t12 : ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k, 'l) t12

    val sexp_of_t : ('tuple -> Sexplib.Sexp.t) ->
           ('variant -> Sexplib.Sexp.t) ->
           ('tuple, 'variant) t -> Sexplib.Sexp.t

    val sexp_of_t1 : ('a0 -> Sexplib.Sexp.t) -> 'a0 t1 -> Sexplib.Sexp.t

    val sexp_of_t2 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a0, 'a1) t2 -> Sexplib.Sexp.t

    val sexp_of_t3 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2) t3 -> Sexplib.Sexp.t

    val sexp_of_t4 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3) t4 -> Sexplib.Sexp.t

    val sexp_of_t5 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4) t5 -> Sexplib.Sexp.t

    val sexp_of_t6 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a5 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4, 'a5) t6 -> Sexplib.Sexp.t

    val sexp_of_t7 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a5 -> Sexplib.Sexp.t) ->
           ('a6 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6) t7 ->
           Sexplib.Sexp.t

    val sexp_of_t8 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a5 -> Sexplib.Sexp.t) ->
           ('a6 -> Sexplib.Sexp.t) ->
           ('a7 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7) t8 ->
           Sexplib.Sexp.t

    val sexp_of_t9 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a5 -> Sexplib.Sexp.t) ->
           ('a6 -> Sexplib.Sexp.t) ->
           ('a7 -> Sexplib.Sexp.t) ->
           ('a8 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8) t9 ->
           Sexplib.Sexp.t

    val sexp_of_t10 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a5 -> Sexplib.Sexp.t) ->
           ('a6 -> Sexplib.Sexp.t) ->
           ('a7 -> Sexplib.Sexp.t) ->
           ('a8 -> Sexplib.Sexp.t) ->
           ('a9 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8, 'a9) t10 ->
           Sexplib.Sexp.t

    val sexp_of_t11 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a5 -> Sexplib.Sexp.t) ->
           ('a6 -> Sexplib.Sexp.t) ->
           ('a7 -> Sexplib.Sexp.t) ->
           ('a8 -> Sexplib.Sexp.t) ->
           ('a9 -> Sexplib.Sexp.t) ->
           ('a10 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8, 'a9, 'a10)
           t11 -> Sexplib.Sexp.t

    val sexp_of_t12 : ('a0 -> Sexplib.Sexp.t) ->
           ('a1 -> Sexplib.Sexp.t) ->
           ('a2 -> Sexplib.Sexp.t) ->
           ('a3 -> Sexplib.Sexp.t) ->
           ('a4 -> Sexplib.Sexp.t) ->
           ('a5 -> Sexplib.Sexp.t) ->
           ('a6 -> Sexplib.Sexp.t) ->
           ('a7 -> Sexplib.Sexp.t) ->
           ('a8 -> Sexplib.Sexp.t) ->
           ('a9 -> Sexplib.Sexp.t) ->
           ('a10 -> Sexplib.Sexp.t) ->
           ('a11 -> Sexplib.Sexp.t) ->
           ('a0, 'a1, 'a2, 'a3, 'a4, 'a5, 'a6, 'a7, 'a8, 'a9, 'a10, 'a11)
           t12 -> Sexplib.Sexp.t