sig
  type 'src source = {
    emit : 'a. ('src, 'a) CConv.Decode.inner_decoder -> 'src -> 'a;
  }
  and ('src, 'into) inner_decoder = {
    accept_unit : 'src CConv.Decode.source -> unit -> 'into;
    accept_bool : 'src CConv.Decode.source -> bool -> 'into;
    accept_float : 'src CConv.Decode.source -> float -> 'into;
    accept_int : 'src CConv.Decode.source -> int -> 'into;
    accept_int32 : 'src CConv.Decode.source -> int32 -> 'into;
    accept_int64 : 'src CConv.Decode.source -> int64 -> 'into;
    accept_nativeint : 'src CConv.Decode.source -> nativeint -> 'into;
    accept_char : 'src CConv.Decode.source -> char -> 'into;
    accept_string : 'src CConv.Decode.source -> string -> 'into;
    accept_list : 'src CConv.Decode.source -> 'src list -> 'into;
    accept_option : 'src CConv.Decode.source -> 'src option -> 'into;
    accept_record : 'src CConv.Decode.source -> (string * 'src) list -> 'into;
    accept_tuple : 'src CConv.Decode.source -> 'src list -> 'into;
    accept_sum : 'src CConv.Decode.source -> string -> 'src list -> 'into;
  }
  type 'into decoder = {
    dec : 'src. ('src, 'into) CConv.Decode.inner_decoder;
  }
  val apply :
    'src CConv.Decode.source -> 'into CConv.Decode.decoder -> 'src -> 'into
  val int : int CConv.Decode.decoder
  val char : char CConv.Decode.decoder
  val int32 : int32 CConv.Decode.decoder
  val int64 : int64 CConv.Decode.decoder
  val nativeint : nativeint CConv.Decode.decoder
  val float : float CConv.Decode.decoder
  val bool : bool CConv.Decode.decoder
  val unit : unit CConv.Decode.decoder
  val string : string CConv.Decode.decoder
  val list : 'CConv.Decode.decoder -> 'a list CConv.Decode.decoder
  val array : 'CConv.Decode.decoder -> 'a array CConv.Decode.decoder
  val sequence :
    'CConv.Decode.decoder -> 'CConv.sequence CConv.Decode.decoder
  val map : ('-> 'b) -> 'CConv.Decode.decoder -> 'CConv.Decode.decoder
  val arg0 : 'src list -> unit
  val arg1 :
    'CConv.Decode.decoder -> 'src CConv.Decode.source -> 'src list -> 'a
  val arg2 :
    'CConv.Decode.decoder ->
    'CConv.Decode.decoder ->
    'src CConv.Decode.source -> 'src list -> 'a * 'b
  val arg3 :
    'CConv.Decode.decoder ->
    'CConv.Decode.decoder ->
    'CConv.Decode.decoder ->
    'src CConv.Decode.source -> 'src list -> 'a * 'b * 'c
  val option : 'CConv.Decode.decoder -> 'a option CConv.Decode.decoder
  val pair :
    'CConv.Decode.decoder ->
    'CConv.Decode.decoder -> ('a * 'b) CConv.Decode.decoder
  val triple :
    'CConv.Decode.decoder ->
    'CConv.Decode.decoder ->
    'CConv.Decode.decoder -> ('a * 'b * 'c) CConv.Decode.decoder
  val record_get :
    string ->
    'into CConv.Decode.decoder ->
    'src CConv.Decode.source -> (string * 'src) list -> 'into
  val record_get_opt :
    string ->
    'into CConv.Decode.decoder ->
    'src CConv.Decode.source -> (string * 'src) list -> 'into option
  type 'into record_decoder = {
    record_accept :
      'src. 'src CConv.Decode.source -> (string * 'src) list -> 'into;
  }
  val record :
    'into CConv.Decode.record_decoder -> 'into CConv.Decode.decoder
  val record_fix :
    ('into CConv.Decode.decoder -> 'into CConv.Decode.record_decoder) ->
    'into CConv.Decode.decoder
  type 'into sum_decoder = {
    sum_accept :
      'src. 'src CConv.Decode.source -> string -> 'src list -> 'into;
  }
  val sum : 'into CConv.Decode.sum_decoder -> 'into CConv.Decode.decoder
  val sum_fix :
    ('into CConv.Decode.decoder -> 'into CConv.Decode.sum_decoder) ->
    'into CConv.Decode.decoder
  type 'into tuple_decoder = {
    tuple_accept : 'src. 'src CConv.Decode.source -> 'src list -> 'into;
  }
  val tuple : 'into CConv.Decode.tuple_decoder -> 'into CConv.Decode.decoder
end