sig
  type 'a ops = {
    descr : string;
    serialize : [ `Fast of '-> Bencode.t | `Slow of '-> Bencode.t Lwt.t ];
    unserialize : Bencode.t -> 'Maki.or_error;
  }
  val make :
    serialize:[ `Fast of '-> Bencode.t | `Slow of '-> Bencode.t Lwt.t ] ->
    unserialize:(Bencode.t -> 'Maki.or_error) ->
    string -> 'Maki.Value.ops
  val make_fast :
    serialize:('-> Bencode.t) ->
    unserialize:(Bencode.t -> 'Maki.or_error) ->
    string -> 'Maki.Value.ops
  val make_slow :
    serialize:('-> Bencode.t Lwt.t) ->
    unserialize:(Bencode.t -> 'Maki.or_error) ->
    string -> 'Maki.Value.ops
  val serialize : 'Maki.Value.ops -> '-> Bencode.t Lwt.t
  val unserialize : 'Maki.Value.ops -> Bencode.t -> 'Maki.or_error
  val to_string : 'Maki.Value.ops -> '-> string Lwt.t
  val of_string : 'Maki.Value.ops -> string -> 'Maki.or_error
  val int : int Maki.Value.ops
  val string : string Maki.Value.ops
  val bool : bool Maki.Value.ops
  val float : float Maki.Value.ops
  val list : 'Maki.Value.ops -> 'a list Maki.Value.ops
  val assoc : 'Maki.Value.ops -> (string * 'a) list Maki.Value.ops
  val map :
    ?descr:string ->
    ('-> 'b) -> ('-> 'a) -> 'Maki.Value.ops -> 'Maki.Value.ops
  val file : Maki.path Maki.Value.ops
  val program : Maki.program Maki.Value.ops
  val set : 'Maki.Value.ops -> 'a list Maki.Value.ops
  val marshal : string -> 'Maki.Value.ops
  val pair :
    'Maki.Value.ops -> 'Maki.Value.ops -> ('a * 'b) Maki.Value.ops
  val triple :
    'Maki.Value.ops ->
    'Maki.Value.ops -> 'Maki.Value.ops -> ('a * 'b * 'c) Maki.Value.ops
  val quad :
    'Maki.Value.ops ->
    'Maki.Value.ops ->
    'Maki.Value.ops ->
    'Maki.Value.ops -> ('a * 'b * 'c * 'd) Maki.Value.ops
  type t = Value : 'Maki.Value.ops * '-> Maki.Value.t
  val argv0 : Maki.Value.t
  val pack : 'Maki.Value.ops -> '-> Maki.Value.t
  val pack_int : int -> Maki.Value.t
  val pack_string : string -> Maki.Value.t
  val pack_bool : bool -> Maki.Value.t
  val pack_file : Maki.path -> Maki.Value.t
  val pack_list : 'Maki.Value.ops -> 'a list -> Maki.Value.t
  val pack_program : Maki.program -> Maki.Value.t
  val pack_set : 'Maki.Value.ops -> 'a list -> Maki.Value.t
  val pack_assoc : 'Maki.Value.ops -> (string * 'a) list -> Maki.Value.t
end