module Slots:Tuple_type.Slots
Slots
has types t1
, ..., t9
of arities 1 to 9 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
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 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