sig
  type database =
      [ `gene
      | `genome
      | `geodatasets
      | `geoprofiles
      | `protein
      | `pubmed
      | `pubmedcentral
      | `sra
      | `taxonomy
      | `unigene ]
  val esearch_url :
    ?retstart:int ->
    ?retmax:int ->
    ?rettype:[ `count | `uilist ] ->
    ?field:string ->
    ?datetype:[ `edat | `mdat | `pdat ] ->
    ?reldate:int ->
    ?mindate:string -> ?maxdate:string -> database -> string -> string
  type esearch_answer =
    Biocaml_entrez.esearch_answer = {
    count : int;
    retmax : int;
    retstart : int;
    ids : string list;
  }
  val esearch_answer_of_string : string -> esearch_answer
  val esummary_url :
    ?retstart:int -> ?retmax:int -> database -> string list -> string
  val efetch_url :
    ?rettype:string ->
    ?retmode:[ `asn_1 | `text | `xml ] ->
    ?retstart:int ->
    ?retmax:int ->
    ?strand:[ `minus | `plus ] ->
    ?seq_start:int -> ?seq_stop:int -> database -> string list -> string
  module type Fetch =
    sig
      type 'a fetched
      val fetch : string -> (string -> 'a) -> 'a fetched
      val ( >>= ) : 'a fetched -> ('-> 'b fetched) -> 'b fetched
      val ( >|= ) : 'a fetched -> ('-> 'b) -> 'b fetched
    end
  module Make :
    functor (F : Fetch->
      sig
        module Object_id :
          sig
            type t = [ `int of int | `string of string ]
            val to_string : t -> string
          end
        module Dbtag :
          sig
            type t =
              Biocaml_entrez.Make(F).Dbtag.t = {
              db : string;
              tag : Object_id.t;
            }
          end
        module Gene_ref :
          sig
            type t =
              Biocaml_entrez.Make(F).Gene_ref.t = {
              locus : string option;
              allele : string option;
              desc : string option;
              maploc : string option;
              pseudo : bool option;
              db : Dbtag.t list;
            }
          end
        module PubmedSummary :
          sig
            type t =
              Biocaml_entrez.Make(F).PubmedSummary.t = {
              pmid : int;
              doi : string option;
              pubdate : string option;
              source : string option;
              title : string;
            }
            val search : string -> t list F.fetched
          end
        module Pubmed :
          sig
            type t =
              Biocaml_entrez.Make(F).Pubmed.t = {
              pmid : int;
              title : string;
              abstract : string;
            }
            val search : string -> t list F.fetched
          end
        module Gene :
          sig
            type t =
              Biocaml_entrez.Make(F).Gene.t = {
              _type :
                [ `miscRNA
                | `ncRNA
                | `other
                | `protein_coding
                | `pseudo
                | `rRNA
                | `scRNA
                | `snRNA
                | `snoRNA
                | `tRNA
                | `transposon
                | `unknown ];
              summary : string option;
              gene : Gene_ref.t;
            }
            val search : string -> t list F.fetched
          end
      end
end