package type_id
Type identifiers, useful for runtime type-safe casting/coersions
Install
Dune Dependency
Authors
Maintainers
Sources
type_id-0.0.1.tbz
sha256=8665400fdbe05351cb9c1eddd535f5ed5f8095fe595e6bd081dda72c79cb8439
sha512=08bb56914a3d3137503efb1254cc51340de107e150f0ad2af102f32744a4837c4630fca2f75a4cb3deaae62b67701f06db9cfb80a541f7bb88d37c4adc5fc775
README.md.html
type_id
What does this library do?
type_id
provides a type -- Type_id.t
-- which can be used to reference and identify a type. This can then be used to construct type proofs between two types which share the same type ID, extending the usefulness of the type_eq
library.
module Types : sig
(* These types are equal, but they're also opaque. *)
type a
type b
(* This type is not equivalent to the above types. *)
type c
val a_of_int: int -> a
val b_of_int: int -> b
val c_of_int: int -> c
val a_id : a Type_id.t
val b_id : b Type_id.t
val b_id_2 : b Type_id.t
val c_id : c Type_id.t
end = struct
type a = string
type b = string
type c = int
let a_of_int = string_of_int
let b_of_int = string_of_int
let c_of_int x = x
let a_id = Type_id.make ~label:"string"
let b_id = a_id
let b_id_2 = Type_id.make ~label:"string-2"
let c_id = Type_id.make ~label:"int"
end
(* These types are different... *)
let a: Types.a = Types.a_of_int 123
let b: Types.b = Types.b_of_int 456
(* But, we can cast between them using their type IDs: *)
let a': Types.a =
match Type_id.eq_res Types.a_id Types.b_id with
| Error e -> failwith (* ... *)
| Ok eq_a_b -> Type_eq.coerce eq_a_b b
Why is this library useful?
Sometimes you'll be working with types which are opaque -- as in the example above. This utility can be used to determine if two opaque types are indeed equal, which can allow you to cast between them, among other operations.
See the .mli
file for a fully-documented interface.
Note that a stripped-down version of this utility is included as Type.eq
in OCaml 5+: https://github.com/ocaml/ocaml/blob/c2d00ef67b4af1e6ba90e77e4106770bbdd88a01/stdlib/type.ml#L18
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>