(** Dynamic values *)

(** Representation of OCaml values such that they can be processed without
    knowing their type. *)
type t =
  | Opaque
  | Unit
  | Int of int
  | Int32 of int32
  | Int64 of int64
  | Nativeint of nativeint
  | Bool of bool
  | String of string
  | Bytes of bytes
  | Char of char
  | Float of float
  | Option of t option
  | List of t list
  | Array of t array
  | Tuple of t list
  | Record of (string * t) list
  | Variant of string * t list
  | Map of (t * t) list
  | Set of t list

val equal : t -> t -> bool

val compare : t -> t -> Ordering.t

val hash : t -> int

val pp : t -> _ Pp.t

val to_string : t -> string

(** {1 Constructors} *)

type 'a builder = 'a -> t

val unit : unit builder

val char : char builder

val string : string builder

val int : int builder

val int32 : int32 builder

val int64 : int64 builder

val nativeint : nativeint builder

val float : float builder

val bool : bool builder

val pair : 'a builder -> 'b builder -> ('a * 'b) builder

val triple : 'a builder -> 'b builder -> 'c builder -> ('a * 'b * 'c) builder

val list : 'a builder -> 'a list builder

val array : 'a builder -> 'a array builder

val option : 'a builder -> 'a option builder

val opaque : _ builder

val record : (string * t) list -> t

val variant : string -> t list -> t
