sig
  module type Chromosome = sig type t val compare : t -> t -> int end
  module Make :
    functor (Chromosome : Chromosome->
      sig
        type range = Biocaml_range.t
        type location = Chromosome.t * range
        module Selection :
          sig
            type t = Biocaml_genomeMap.Make(Chromosome).Selection.t
            val inter : t -> t -> t
            val union : t -> t -> t
            val diff : t -> t -> t
            val size : t -> int
            val intersects : t -> location -> bool
            val overlap : t -> location -> int
            val to_stream : t -> location Stream.t
            val of_stream : location Stream.t -> t
          end
        module type Signal =
          sig
            type 'a t
            val eval : 'a t -> default:'-> Chromosome.t -> int -> 'a
            val fold :
              'a t -> init:'-> f:('-> location -> '-> 'c) -> 'c
            val to_stream : 'a t -> (location * 'a) Stream.t
            val of_stream :
              ('-> '-> 'a) -> (location * 'a) Stream.t -> 'a t
          end
        module LSet :
          sig
            type t = Biocaml_genomeMap.Make(Chromosome).LSet.t
            val to_stream : t -> location Stream.t
            val of_stream : location Stream.t -> t
            val intersects : t -> location -> bool
            val closest : t -> location -> (location * int) option
            val intersecting_elems : t -> location -> location Stream.t
          end
        module LMap :
          sig
            type 'a t = 'Biocaml_genomeMap.Make(Chromosome).LMap.t
            val to_stream : 'a t -> (location * 'a) Stream.t
            val of_stream : (location * 'a) Stream.t -> 'a t
            val intersects : 'a t -> location -> bool
            val closest : 'a t -> location -> (location * 'a * int) option
            val intersecting_elems :
              'a t -> location -> (location * 'a) Stream.t
          end
      end
end