sig
  type ('a, 'b) value_decoder = '-> [ `Error of string | `Ok of 'b ]
  type ('b, 'a) value_encoder = '-> 'a
  type ('a, 'b) value_codec =
      ('a, 'b) Jsont.value_decoder * ('b, 'a) Jsont.value_encoder
  type loc = (int * int) * (int * int)
  type 'a def = Jsont.loc * 'a
  val invalid_loc : Jsont.loc
  val is_invalid_loc : Jsont.loc -> bool
  val invalid_def : '-> 'Jsont.def
  val undef : 'Jsont.def -> 'a
  type nat_string = Jsont_codec.nat_string
  val nat_string_of_string : string -> Jsont.nat_string
  val nat_string_to_string : Jsont.nat_string -> string
  type soup = Jsont_codec.soup
  type obj
  type 'a codec
  val default : 'Jsont.codec -> 'a
  val with_default : '-> 'Jsont.codec -> 'Jsont.codec
  val null : [ `Null ] Jsont.codec
  val bool : bool Jsont.codec
  val float : float Jsont.codec
  val int : int Jsont.codec
  val int_strict : int Jsont.codec
  val string : string Jsont.codec
  val nat_string : Jsont.nat_string Jsont.codec
  val nullable : 'Jsont.codec -> 'a option Jsont.codec
  val view :
    ?default:'->
    ('a, 'b) Jsont.value_codec -> 'Jsont.codec -> 'Jsont.codec
  val enum : ?default:'-> (string * 'a) list -> 'Jsont.codec
  val type_match :
    default:'->
    ([ `Array | `Bool | `Float | `Null | `Object | `String ] ->
     [ `Error of string | `Ok of 'Jsont.codec ]) ->
    ('-> 'Jsont.codec) -> 'Jsont.codec
  val soup : Jsont.soup Jsont.codec
  type json =
      [ `A of json list
      | `Bool of bool
      | `Float of float
      | `Null
      | `O of (Jsont.nat_string * json) list
      | `String of Jsont.nat_string ]
  val json : Jsont.json Jsont.codec
  val some : 'Jsont.codec -> 'a option Jsont.codec
  val array : 'Jsont.codec -> 'a list Jsont.codec
  val array_array : 'Jsont.codec -> 'a array Jsont.codec
  type objc
  type 'a mem
  type 'a anon
  val objc : ?kind:string -> unit -> Jsont.objc
  val mem :
    ?eq:('-> '-> bool) ->
    ?opt:[ `No | `Yes | `Yes_rem ] ->
    Jsont.objc -> string -> 'Jsont.codec -> 'Jsont.mem
  val mem_opt : Jsont.objc -> string -> 'Jsont.codec -> 'a option Jsont.mem
  val mem_match :
    ?eq:('-> '-> bool) ->
    ?opt:[ `No | `Yes | `Yes_rem ] ->
    Jsont.objc ->
    'Jsont.mem -> string -> ('-> 'Jsont.codec) -> 'Jsont.mem
  val anon :
    ?default:(string * 'a) list ->
    Jsont.objc -> 'Jsont.codec -> 'Jsont.anon
  val obj : ?seal:bool -> Jsont.objc -> Jsont.obj Jsont.codec
  type memv
  val memv : 'Jsont.mem -> '-> Jsont.memv
  val anonv : 'Jsont.anon -> string -> '-> Jsont.memv
  val new_obj : Jsont.obj Jsont.codec -> Jsont.memv list -> Jsont.obj
  val get : 'Jsont.mem -> Jsont.obj -> 'a
  val set : 'Jsont.mem -> Jsont.obj -> '-> Jsont.obj
  val anon_names : 'Jsont.anon -> Jsont.obj -> string list
  val find_anon : 'Jsont.anon -> string -> Jsont.obj -> 'a option
  val get_anon : 'Jsont.anon -> string -> Jsont.obj -> 'a
  val add_anon : 'Jsont.anon -> string -> Jsont.obj -> '-> Jsont.obj
  val rem_anon : 'Jsont.anon -> string -> Jsont.obj -> Jsont.obj
  val get_def : 'Jsont.mem -> Jsont.obj -> 'Jsont.def
  val find_anon_def :
    'Jsont.anon -> string -> Jsont.obj -> 'Jsont.def option
  val get_anon_def : 'Jsont.anon -> string -> Jsont.obj -> 'Jsont.def
  type error =
      [ `Json_decoder of Jsont_codec.error
      | `Member of string * string * [ `Dup | `Miss | `Unknown ]
      | `Type of string * string
      | `Value_decoder of string ]
  val error_to_string : Jsont.error -> string
  type 'a decoder
  val decoder :
    ?loc:bool ->
    ?dups:[ `Error | `Skip ] ->
    ?unknown:[ `Error | `Skip ] ->
    Jsont_codec.decoder -> 'Jsont.codec -> 'Jsont.decoder
  val decode :
    'Jsont.decoder ->
    [ `Await | `Error of Jsont.error Jsont.def | `Ok of 'Jsont.def ]
  val decoder_decoder : 'Jsont.decoder -> Jsont_codec.decoder
  type encoder
  val encoder : Jsont_codec.encoder -> 'Jsont.codec -> '-> Jsont.encoder
  val encode : Jsont.encoder -> [ `Ok | `Partial ]
  val encoder_encoder : Jsont.encoder -> Jsont_codec.encoder
end