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 -> Biocaml_entrez.database -> string -> string
  type esearch_answer = {
    count : int;
    retmax : int;
    retstart : int;
    ids : string list;
  }
  val esearch_answer_of_string : string -> Biocaml_entrez.esearch_answer
  val esummary_url :
    ?retstart:int ->
    ?retmax:int -> Biocaml_entrez.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 -> Biocaml_entrez.database -> string list -> string
  module type Fetch =
    sig
      type 'a fetched
      val fetch : string -> (string -> 'a) -> 'Biocaml_entrez.Fetch.fetched
      val ( >>= ) :
        'Biocaml_entrez.Fetch.fetched ->
        ('-> 'Biocaml_entrez.Fetch.fetched) ->
        'Biocaml_entrez.Fetch.fetched
      val ( >|= ) :
        'Biocaml_entrez.Fetch.fetched ->
        ('-> 'b) -> 'Biocaml_entrez.Fetch.fetched
    end
  module Make :
    functor (F : Fetch->
      sig
        module Object_id :
          sig
            type t = [ `int of int | `string of string ]
            val to_string : Biocaml_entrez.Make.Object_id.t -> string
          end
        module Dbtag :
          sig
            type t = { db : string; tag : Biocaml_entrez.Make.Object_id.t; }
          end
        module Gene_ref :
          sig
            type t = {
              locus : string option;
              allele : string option;
              desc : string option;
              maploc : string option;
              pseudo : bool option;
              db : Biocaml_entrez.Make.Dbtag.t list;
            }
          end
        module PubmedSummary :
          sig
            type t = {
              pmid : int;
              doi : string option;
              pubdate : string option;
              source : string option;
              title : string;
            }
            val search :
              string -> Biocaml_entrez.Make.PubmedSummary.t list F.fetched
          end
        module Pubmed :
          sig
            type t = { pmid : int; title : string; abstract : string; }
            val search :
              string -> Biocaml_entrez.Make.Pubmed.t list F.fetched
          end
        module Gene :
          sig
            type t = {
              _type :
                [ `miscRNA
                | `ncRNA
                | `other
                | `protein_coding
                | `pseudo
                | `rRNA
                | `scRNA
                | `snRNA
                | `snoRNA
                | `tRNA
                | `transposon
                | `unknown ];
              summary : string option;
              gene : Biocaml_entrez.Make.Gene_ref.t;
            }
            val search : string -> Biocaml_entrez.Make.Gene.t list F.fetched
          end
      end
end