sig
  type header_item_tag = private
      [< `CO | `HD | `Other of string | `PG | `RG | `SQ ]
  type tag_value = private string * string
  type sort_order = [ `Coordinate | `Query_name | `Unknown | `Unsorted ]
  type header_line = private {
    version : string;
    sort_order : Biocaml_sam.sort_order option;
  }
  type ref_seq = private {
    name : string;
    length : int;
    assembly : string option;
    md5 : string option;
    species : string option;
    uri : string option;
  }
  type platform =
      [ `Capillary
      | `Helicos
      | `Illumina
      | `Ion_Torrent
      | `LS454
      | `Pac_Bio
      | `Solid ]
  type read_group = private {
    id : string;
    seq_center : string option;
    description : string option;
    run_date : [ `Date of Core.Std.Date.t | `Time of Core.Std.Time.t ] option;
    flow_order : string option;
    key_seq : string option;
    library : string option;
    program : string option;
    predicted_median_insert_size : int option;
    platform : Biocaml_sam.platform option;
    platform_unit : string option;
    sample : string option;
  }
  type program = private {
    id : string;
    name : string option;
    command_line : string option;
    previous_id : string option;
    description : string option;
    version : string option;
  }
  type header_item = private
      [< `CO of string
       | `HD of Biocaml_sam.header_line
       | `Other of string * Biocaml_sam.tag_value list
       | `PG of Biocaml_sam.program
       | `RG of Biocaml_sam.read_group
       | `SQ of Biocaml_sam.ref_seq ]
  type header = private {
    version : string option;
    sort_order : Biocaml_sam.sort_order option;
    ref_seqs : Biocaml_sam.ref_seq list;
    read_groups : Biocaml_sam.read_group list;
    programs : Biocaml_sam.program list;
    comments : string list;
    others : (string * Biocaml_sam.tag_value list) list;
  }
  val empty_header : Biocaml_sam.header
  module Flags :
    sig
      type t = private int
      val of_int : int -> Biocaml_sam.Flags.t Core.Std.Or_error.t
      val has_multiple_segments : Biocaml_sam.Flags.t -> bool
      val each_segment_properly_aligned : Biocaml_sam.Flags.t -> bool
      val segment_unmapped : Biocaml_sam.Flags.t -> bool
      val next_segment_unmapped : Biocaml_sam.Flags.t -> bool
      val seq_is_reverse_complemented : Biocaml_sam.Flags.t -> bool
      val next_seq_is_reverse_complemented : Biocaml_sam.Flags.t -> bool
      val first_segment : Biocaml_sam.Flags.t -> bool
      val last_segment : Biocaml_sam.Flags.t -> bool
      val secondary_alignment : Biocaml_sam.Flags.t -> bool
      val not_passing_quality_controls : Biocaml_sam.Flags.t -> bool
      val pcr_or_optical_duplicate : Biocaml_sam.Flags.t -> bool
      val supplementary_alignment : Biocaml_sam.Flags.t -> bool
      val t_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.Flags.t
      val sexp_of_t : Biocaml_sam.Flags.t -> Sexplib.Sexp.t
    end
  type cigar_op = private
      [< `Alignment_match of int
       | `Deletion of int
       | `Hard_clipping of int
       | `Insertion of int
       | `Padding of int
       | `Seq_match of int
       | `Seq_mismatch of int
       | `Skipped of int
       | `Soft_clipping of int ]
  type optional_field_value = private
      [< `A of char
       | `B of char * string list
       | `H of string
       | `Z of string
       | `of float
       | `of Core.Std.Int32.t ]
  type optional_field = private {
    tag : string;
    value : Biocaml_sam.optional_field_value;
  }
  type rnext = private [< `Equal_to_RNAME | `Value of string ]
  type alignment = private {
    qname : string option;
    flags : Biocaml_sam.Flags.t;
    rname : string option;
    pos : int option;
    mapq : int option;
    cigar : Biocaml_sam.cigar_op list;
    rnext : Biocaml_sam.rnext option;
    pnext : int option;
    tlen : int option;
    seq : string option;
    qual : Biocaml_phred_score.t list;
    optional_fields : Biocaml_sam.optional_field list;
  }
  module MakeIO :
    functor (Future : Future.S->
      sig
        val read :
          ?start:Biocaml_internal_utils.Pos.t ->
          Future.Reader.t ->
          (Biocaml_sam.header *
           Biocaml_sam.alignment Core.Std.Or_error.t Future.Pipe.Reader.t)
          Core.Std.Or_error.t Future.Deferred.t
        val write :
          Future.Writer.t ->
          ?header:Biocaml_sam.header ->
          Biocaml_sam.alignment Future.Pipe.Reader.t ->
          unit Future.Deferred.t
        val write_file :
          ?perm:int ->
          ?append:bool ->
          string ->
          ?header:Biocaml_sam.header ->
          Biocaml_sam.alignment Future.Pipe.Reader.t ->
          unit Future.Deferred.t
      end
  val read :
    ?start:Biocaml_internal_utils.Pos.t ->
    Future_std.Reader.t ->
    (header * alignment Core.Std.Or_error.t Future_std.Pipe.Reader.t)
    Core.Std.Or_error.t Future_std.Deferred.t
  val write :
    Future_std.Writer.t ->
    ?header:header ->
    alignment Future_std.Pipe.Reader.t -> unit Future_std.Deferred.t
  val write_file :
    ?perm:int ->
    ?append:bool ->
    string ->
    ?header:header ->
    alignment Future_std.Pipe.Reader.t -> unit Future_std.Deferred.t
  val header_line :
    version:string ->
    ?sort_order:Biocaml_sam.sort_order ->
    unit -> Biocaml_sam.header_line Core.Std.Or_error.t
  val ref_seq :
    name:string ->
    length:int ->
    ?assembly:string ->
    ?md5:string ->
    ?species:string ->
    ?uri:string -> unit -> Biocaml_sam.ref_seq Core.Std.Or_error.t
  val read_group :
    id:string ->
    ?seq_center:string ->
    ?description:string ->
    ?run_date:string ->
    ?flow_order:string ->
    ?key_seq:string ->
    ?library:string ->
    ?program:string ->
    ?predicted_median_insert_size:int ->
    ?platform:Biocaml_sam.platform ->
    ?platform_unit:string ->
    ?sample:string -> unit -> Biocaml_sam.read_group Core.Std.Or_error.t
  val header :
    ?version:string ->
    ?sort_order:Biocaml_sam.sort_order ->
    ?ref_seqs:Biocaml_sam.ref_seq list ->
    ?read_groups:Biocaml_sam.read_group list ->
    ?programs:Biocaml_sam.program list ->
    ?comments:string list ->
    ?others:(string * Biocaml_sam.tag_value list) list ->
    unit -> Biocaml_sam.header Core.Std.Or_error.t
  val parse_header_item_tag :
    string -> Biocaml_sam.header_item_tag Core.Std.Or_error.t
  val parse_tag_value : string -> Biocaml_sam.tag_value Core.Std.Or_error.t
  val parse_header_version : string -> string Core.Std.Or_error.t
  val parse_sort_order : string -> Biocaml_sam.sort_order Core.Std.Or_error.t
  val parse_header_line :
    Biocaml_sam.tag_value list -> Biocaml_sam.header_line Core.Std.Or_error.t
  val parse_ref_seq :
    Biocaml_sam.tag_value list -> Biocaml_sam.ref_seq Core.Std.Or_error.t
  val parse_platform : string -> Biocaml_sam.platform Core.Std.Or_error.t
  val parse_read_group :
    Biocaml_sam.tag_value list -> Biocaml_sam.read_group Core.Std.Or_error.t
  val parse_program :
    Biocaml_sam.tag_value list -> Biocaml_sam.program Core.Std.Or_error.t
  val parse_header_item :
    Biocaml_internal_utils.Line.t ->
    Biocaml_sam.header_item Core.Std.Or_error.t
  val parse_header : string -> Biocaml_sam.header Core.Std.Or_error.t
  val cigar_op_alignment_match :
    int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_insertion : int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_deletion : int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_skipped : int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_soft_clipping :
    int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_hard_clipping :
    int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_padding : int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_seq_match : int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val cigar_op_seq_mismatch : int -> Biocaml_sam.cigar_op Core.Std.Or_error.t
  val optional_field_value_A :
    char -> Biocaml_sam.optional_field_value Core.Std.Or_error.t
  val optional_field_value_i :
    Core.Std.Int32.t -> Biocaml_sam.optional_field_value
  val optional_field_value_f : float -> Biocaml_sam.optional_field_value
  val optional_field_value_Z :
    string -> Biocaml_sam.optional_field_value Core.Std.Or_error.t
  val optional_field_value_H :
    string -> Biocaml_sam.optional_field_value Core.Std.Or_error.t
  val optional_field_value_B :
    char ->
    string list -> Biocaml_sam.optional_field_value Core.Std.Or_error.t
  val optional_field :
    string ->
    Biocaml_sam.optional_field_value ->
    Biocaml_sam.optional_field Core.Std.Or_error.t
  val parse_optional_field_value :
    string -> Biocaml_sam.optional_field_value Core.Std.Or_error.t
  val parse_optional_field :
    string -> Biocaml_sam.optional_field Core.Std.Or_error.t
  val alignment :
    ?ref_seqs:Core.Std.String.Set.t ->
    ?qname:string ->
    flags:Biocaml_sam.Flags.t ->
    ?rname:string ->
    ?pos:int ->
    ?mapq:int ->
    ?cigar:Biocaml_sam.cigar_op list ->
    ?rnext:Biocaml_sam.rnext ->
    ?pnext:int ->
    ?tlen:int ->
    ?seq:string ->
    ?qual:Biocaml_phred_score.t list ->
    ?optional_fields:Biocaml_sam.optional_field list ->
    unit -> Biocaml_sam.alignment Core.Std.Or_error.t
  val parse_qname : string -> string option Core.Std.Or_error.t
  val parse_flags : string -> Biocaml_sam.Flags.t Core.Std.Or_error.t
  val parse_rname : string -> string option Core.Std.Or_error.t
  val parse_pos : string -> int option Core.Std.Or_error.t
  val parse_mapq : string -> int option Core.Std.Or_error.t
  val parse_cigar : string -> Biocaml_sam.cigar_op list Core.Std.Or_error.t
  val parse_rnext : string -> Biocaml_sam.rnext option Core.Std.Or_error.t
  val parse_pnext : string -> int option Core.Std.Or_error.t
  val parse_tlen : string -> int option Core.Std.Or_error.t
  val parse_seq : string -> string option Core.Std.Or_error.t
  val parse_qual : string -> Biocaml_phred_score.t list Core.Std.Or_error.t
  val parse_alignment :
    ?ref_seqs:Core.Std.String.Set.t ->
    Biocaml_internal_utils.Line.t ->
    Biocaml_sam.alignment Core.Std.Or_error.t
  val print_header_item_tag : Biocaml_sam.header_item_tag -> string
  val print_tag_value : Biocaml_sam.tag_value -> string
  val print_header_version : string -> string
  val print_sort_order : Biocaml_sam.sort_order -> string
  val print_header_line : Biocaml_sam.header_line -> string
  val print_ref_seq : Biocaml_sam.ref_seq -> string
  val print_platform : Biocaml_sam.platform -> string
  val print_read_group : Biocaml_sam.read_group -> string
  val print_program : Biocaml_sam.program -> string
  val print_other : string * Biocaml_sam.tag_value list -> string
  val print_qname : string option -> string
  val print_flags : Biocaml_sam.Flags.t -> string
  val print_rname : string option -> string
  val print_pos : int option -> string
  val print_mapq : int option -> string
  val print_cigar_op : Biocaml_sam.cigar_op -> string
  val print_cigar : Biocaml_sam.cigar_op list -> string
  val print_rnext : Biocaml_sam.rnext option -> string
  val print_pnext : int option -> string
  val print_tlen : int option -> string
  val print_seq : string option -> string
  val print_qual : Biocaml_phred_score.t list -> string
  val print_optional_field : Biocaml_sam.optional_field -> string
  val print_alignment : Biocaml_sam.alignment -> string
  val header_item_tag_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.header_item_tag
  val __header_item_tag_of_sexp__ :
    Sexplib.Sexp.t -> Biocaml_sam.header_item_tag
  val sexp_of_header_item_tag : Biocaml_sam.header_item_tag -> Sexplib.Sexp.t
  val tag_value_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.tag_value
  val sexp_of_tag_value : Biocaml_sam.tag_value -> Sexplib.Sexp.t
  val sort_order_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.sort_order
  val __sort_order_of_sexp__ : Sexplib.Sexp.t -> Biocaml_sam.sort_order
  val sexp_of_sort_order : Biocaml_sam.sort_order -> Sexplib.Sexp.t
  val header_line_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.header_line
  val sexp_of_header_line : Biocaml_sam.header_line -> Sexplib.Sexp.t
  val ref_seq_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.ref_seq
  val sexp_of_ref_seq : Biocaml_sam.ref_seq -> Sexplib.Sexp.t
  val platform_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.platform
  val __platform_of_sexp__ : Sexplib.Sexp.t -> Biocaml_sam.platform
  val sexp_of_platform : Biocaml_sam.platform -> Sexplib.Sexp.t
  val read_group_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.read_group
  val sexp_of_read_group : Biocaml_sam.read_group -> Sexplib.Sexp.t
  val program_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.program
  val sexp_of_program : Biocaml_sam.program -> Sexplib.Sexp.t
  val header_item_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.header_item
  val __header_item_of_sexp__ : Sexplib.Sexp.t -> Biocaml_sam.header_item
  val sexp_of_header_item : Biocaml_sam.header_item -> Sexplib.Sexp.t
  val cigar_op_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.cigar_op
  val __cigar_op_of_sexp__ : Sexplib.Sexp.t -> Biocaml_sam.cigar_op
  val sexp_of_cigar_op : Biocaml_sam.cigar_op -> Sexplib.Sexp.t
  val optional_field_value_of_sexp :
    Sexplib.Sexp.t -> Biocaml_sam.optional_field_value
  val __optional_field_value_of_sexp__ :
    Sexplib.Sexp.t -> Biocaml_sam.optional_field_value
  val sexp_of_optional_field_value :
    Biocaml_sam.optional_field_value -> Sexplib.Sexp.t
  val optional_field_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.optional_field
  val sexp_of_optional_field : Biocaml_sam.optional_field -> Sexplib.Sexp.t
  val rnext_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.rnext
  val __rnext_of_sexp__ : Sexplib.Sexp.t -> Biocaml_sam.rnext
  val sexp_of_rnext : Biocaml_sam.rnext -> Sexplib.Sexp.t
  val alignment_of_sexp : Sexplib.Sexp.t -> Biocaml_sam.alignment
  val sexp_of_alignment : Biocaml_sam.alignment -> Sexplib.Sexp.t
end