sig
  type record = {
    seqname : string;
    source : string option;
    feature : string option;
    pos : int * int;
    score : float option;
    strand : [ `minus | `not_applicable | `plus | `unknown ];
    phase : int option;
    attributes : (string * string list) list;
  }
  type item = [ `comment of string | `record of Biocaml_gff.record ]
  module Error :
    sig
      type parsing =
          [ `cannot_parse_float of Biocaml_internal_utils.Pos.t * string
          | `cannot_parse_int of Biocaml_internal_utils.Pos.t * string
          | `cannot_parse_strand of Biocaml_internal_utils.Pos.t * string
          | `cannot_parse_string of Biocaml_internal_utils.Pos.t * string
          | `empty_line of Biocaml_internal_utils.Pos.t
          | `incomplete_input of
              Biocaml_internal_utils.Pos.t * string list * string option
          | `wrong_attributes of Biocaml_internal_utils.Pos.t * string
          | `wrong_row of Biocaml_internal_utils.Pos.t * string
          | `wrong_url_escaping of Biocaml_internal_utils.Pos.t * string ]
      type t = Biocaml_gff.Error.parsing
      val parsing_of_sexp : Sexplib.Sexp.t -> Biocaml_gff.Error.parsing
      val sexp_of_parsing : Biocaml_gff.Error.parsing -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> Biocaml_gff.Error.t
      val sexp_of_t : Biocaml_gff.Error.t -> Sexplib.Sexp.t
    end
  module Tags :
    sig
      type t = {
        version : [ `three | `two ];
        allow_empty_lines : bool;
        sharp_comments : bool;
      }
      val default : Biocaml_gff.Tags.t
      val of_string :
        string ->
        (Biocaml_gff.Tags.t, [> `gff of [> `tags_of_string of exn ] ])
        Biocaml_internal_utils.Result.t
      val to_string : Biocaml_gff.Tags.t -> string
      val t_of_sexp : Sexplib.Sexp.t -> Biocaml_gff.Tags.t
      val sexp_of_t : Biocaml_gff.Tags.t -> Sexplib.Sexp.t
    end
  exception Error of Biocaml_gff.Error.t
  val in_channel_to_item_stream :
    ?buffer_size:int ->
    ?filename:string ->
    ?tags:Biocaml_gff.Tags.t ->
    Pervasives.in_channel ->
    (Biocaml_gff.item, [> Biocaml_gff.Error.parsing ])
    Biocaml_internal_utils.Result.t Biocaml_internal_utils.Stream.t
  val in_channel_to_item_stream_exn :
    ?buffer_size:int ->
    ?tags:Biocaml_gff.Tags.t ->
    Pervasives.in_channel -> Biocaml_gff.item Biocaml_internal_utils.Stream.t
  val item_to_string : ?tags:Biocaml_gff.Tags.t -> Biocaml_gff.item -> string
  module Transform :
    sig
      val string_to_item :
        ?filename:string ->
        tags:Biocaml_gff.Tags.t ->
        unit ->
        (string,
         (Biocaml_gff.item, [> Biocaml_gff.Error.parsing ])
         Biocaml_internal_utils.Result.t)
        Biocaml_transform.t
      val item_to_string :
        tags:Biocaml_gff.Tags.t ->
        unit -> (Biocaml_gff.item, string) Biocaml_transform.t
    end
  val record_of_sexp : Sexplib.Sexp.t -> Biocaml_gff.record
  val sexp_of_record : Biocaml_gff.record -> Sexplib.Sexp.t
  val item_of_sexp : Sexplib.Sexp.t -> Biocaml_gff.item
  val sexp_of_item : Biocaml_gff.item -> Sexplib.Sexp.t
end