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