sig
  exception ConversionFailure of string
  type 'a sequence = ('-> unit) -> unit
  val report_error : ('a, Buffer.t, unit, 'b) Pervasives.format4 -> 'a
  module Encode :
    sig
      type 'a output = {
        unit : 'a;
        bool : bool -> 'a;
        float : float -> 'a;
        char : char -> 'a;
        int : int -> 'a;
        nativeint : nativeint -> 'a;
        int32 : int32 -> 'a;
        int64 : int64 -> 'a;
        string : string -> 'a;
        list : 'a list -> 'a;
        option : 'a option -> 'a;
        record : (string * 'a) list -> 'a;
        tuple : 'a list -> 'a;
        sum : string -> 'a list -> 'a;
      }
      val string_target : string CConv.Encode.output
      type 'src encoder = {
        emit : 'into. 'into CConv.Encode.output -> 'src -> 'into;
      }
      val unit : unit CConv.Encode.encoder
      val bool : bool CConv.Encode.encoder
      val float : float CConv.Encode.encoder
      val char : char CConv.Encode.encoder
      val int : int CConv.Encode.encoder
      val nativeint : nativeint CConv.Encode.encoder
      val int32 : int32 CConv.Encode.encoder
      val int64 : int64 CConv.Encode.encoder
      val string : string CConv.Encode.encoder
      val list : 'CConv.Encode.encoder -> 'a list CConv.Encode.encoder
      val map :
        ('-> 'b) -> 'CConv.Encode.encoder -> 'CConv.Encode.encoder
      val array : 'CConv.Encode.encoder -> 'a array CConv.Encode.encoder
      val sequence :
        'CConv.Encode.encoder -> 'CConv.sequence CConv.Encode.encoder
      val apply :
        'into CConv.Encode.output ->
        'src CConv.Encode.encoder -> 'src -> 'into
      type 'r record_encoder = {
        record_emit :
          'into. 'into CConv.Encode.output -> '-> (string * 'into) list;
      }
      val record : 'CConv.Encode.record_encoder -> 'CConv.Encode.encoder
      val record_fix :
        ('CConv.Encode.encoder -> 'CConv.Encode.record_encoder) ->
        'CConv.Encode.encoder
      type 't tuple_encoder = {
        tuple_emit : 'into. 'into CConv.Encode.output -> '-> 'into list;
      }
      val tuple : 'CConv.Encode.tuple_encoder -> 'CConv.Encode.encoder
      val pair :
        'CConv.Encode.encoder ->
        'CConv.Encode.encoder -> ('a * 'b) CConv.Encode.encoder
      val triple :
        'CConv.Encode.encoder ->
        'CConv.Encode.encoder ->
        'CConv.Encode.encoder -> ('a * 'b * 'c) CConv.Encode.encoder
      val quad :
        'CConv.Encode.encoder ->
        'CConv.Encode.encoder ->
        'CConv.Encode.encoder ->
        'CConv.Encode.encoder -> ('a * 'b * 'c * 'd) CConv.Encode.encoder
      type 's sum_encoder = {
        sum_emit :
          'into. 'into CConv.Encode.output -> '-> string * 'into list;
      }
      val sum : 'CConv.Encode.sum_encoder -> 'CConv.Encode.encoder
      val sum0 : ('-> string) -> 'CConv.Encode.encoder
      val sum_fix :
        ('CConv.Encode.encoder -> 'CConv.Encode.sum_encoder) ->
        'CConv.Encode.encoder
      val option : 'CConv.Encode.encoder -> 'a option CConv.Encode.encoder
    end
  module Decode :
    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
  type 'a or_error = [ `Error of string | `Ok of 'a ]
  val encode :
    'src CConv.Encode.encoder -> 'into CConv.Encode.output -> 'src -> 'into
  val to_string : 'src CConv.Encode.encoder -> 'src -> string
  val decode_exn :
    'src CConv.Decode.source -> 'into CConv.Decode.decoder -> 'src -> 'into
  val decode :
    'src CConv.Decode.source ->
    'into CConv.Decode.decoder -> 'src -> 'into CConv.or_error
end