sig
  type 'a sequence = ('a -> unit) -> unit
  type 'a equal = 'a -> 'a -> bool
  type 'a ord = 'a -> 'a -> int
  type 'a hash = 'a -> int
  type 'a with_err = [ `Error of string | `Ok of 'a ]
  module PMap :
    sig
      type ('a, 'b) t
      val get : ('a, 'b) CCLinq.PMap.t -> 'a -> 'b option
      val size : ('a, 'b) CCLinq.PMap.t -> int
      val to_seq : ('a, 'b) CCLinq.PMap.t -> ('a * 'b) CCLinq.sequence
      val map :
        ('b -> 'c) -> ('a, 'b) CCLinq.PMap.t -> ('a, 'c) CCLinq.PMap.t
      val to_list : ('a, 'b) CCLinq.PMap.t -> ('a * 'b) list
      val reverse :
        ?cmp:'b CCLinq.ord ->
        ?eq:'b CCLinq.equal ->
        ?hash:'b CCLinq.hash ->
        unit -> ('a, 'b) CCLinq.PMap.t -> ('b, 'a list) CCLinq.PMap.t
      val reverse_multimap :
        ?cmp:'b CCLinq.ord ->
        ?eq:'b CCLinq.equal ->
        ?hash:'b CCLinq.hash ->
        unit -> ('a, 'b list) CCLinq.PMap.t -> ('b, 'a list) CCLinq.PMap.t
      val fold :
        ('acc -> 'a -> 'b -> 'acc) -> 'acc -> ('a, 'b) CCLinq.PMap.t -> 'acc
      val fold_multimap :
        ('acc -> 'a -> 'b -> 'acc) ->
        'acc -> ('a, 'b list) CCLinq.PMap.t -> 'acc
      val get_seq : 'a -> ('a, 'b) CCLinq.PMap.t -> 'b CCLinq.sequence
      val iter : ('a, 'b) CCLinq.PMap.t -> ('a * 'b) CCLinq.sequence
      val flatten :
        ('a, 'b CCLinq.sequence) CCLinq.PMap.t -> ('a * 'b) CCLinq.sequence
      val flatten_l :
        ('a, 'b list) CCLinq.PMap.t -> ('a * 'b) CCLinq.sequence
    end
  type 'a t
  val empty : 'a CCLinq.t
  val start : 'a -> 'a CCLinq.t
  val return : 'a -> 'a CCLinq.t
  val of_list : 'a list -> 'a CCLinq.t
  val of_array : 'a array -> 'a CCLinq.t
  val of_array_i : 'a array -> (int * 'a) CCLinq.t
  val range : int -> int -> int CCLinq.t
  val ( -- ) : int -> int -> int CCLinq.t
  val of_hashtbl : ('a, 'b) Hashtbl.t -> ('a * 'b) CCLinq.t
  val of_seq : 'a CCLinq.sequence -> 'a CCLinq.t
  val of_queue : 'a Queue.t -> 'a CCLinq.t
  val of_stack : 'a Stack.t -> 'a CCLinq.t
  val of_string : string -> char CCLinq.t
  val run : ?limit:int -> 'a CCLinq.t -> 'a CCLinq.sequence
  val run1 : 'a CCLinq.t -> 'a
  val run_no_optim : ?limit:int -> 'a CCLinq.t -> 'a CCLinq.sequence
  val map : ('a -> 'b) -> 'a CCLinq.t -> 'b CCLinq.t
  val ( >|= ) : 'a CCLinq.t -> ('a -> 'b) -> 'b CCLinq.t
  val filter : ('a -> bool) -> 'a CCLinq.t -> 'a CCLinq.t
  val size : 'a CCLinq.t -> int CCLinq.t
  val choose : 'a CCLinq.t -> 'a CCLinq.t
  val filter_map : ('a -> 'b option) -> 'a CCLinq.t -> 'b CCLinq.t
  val flat_map : ('a -> 'b CCLinq.sequence) -> 'a CCLinq.t -> 'b CCLinq.t
  val flat_map_l : ('a -> 'b list) -> 'a CCLinq.t -> 'b CCLinq.t
  val flatten : 'a list CCLinq.t -> 'a CCLinq.t
  val flatten_seq : 'a CCLinq.sequence CCLinq.t -> 'a CCLinq.t
  val take : int -> 'a CCLinq.t -> 'a CCLinq.t
  val take_while : ('a -> bool) -> 'a CCLinq.t -> 'a CCLinq.t
  val sort : ?cmp:'a CCLinq.ord -> unit -> 'a CCLinq.t -> 'a CCLinq.t
  val distinct : ?cmp:'a CCLinq.ord -> unit -> 'a CCLinq.t -> 'a CCLinq.t
  val group_by :
    ?cmp:'b CCLinq.ord ->
    ?eq:'b CCLinq.equal ->
    ?hash:'b CCLinq.hash ->
    ('a -> 'b) -> 'a CCLinq.t -> ('b, 'a list) CCLinq.PMap.t CCLinq.t
  val group_by' :
    ?cmp:'b CCLinq.ord ->
    ?eq:'b CCLinq.equal ->
    ?hash:'b CCLinq.hash ->
    ('a -> 'b) -> 'a CCLinq.t -> ('b * 'a list) CCLinq.t
  val count :
    ?cmp:'a CCLinq.ord ->
    ?eq:'a CCLinq.equal ->
    ?hash:'a CCLinq.hash ->
    unit -> 'a CCLinq.t -> ('a, int) CCLinq.PMap.t CCLinq.t
  val count' :
    ?cmp:'a CCLinq.ord -> unit -> 'a CCLinq.t -> ('a * int) CCLinq.t
  val fold : ('b -> 'a -> 'b) -> 'b -> 'a CCLinq.t -> 'b CCLinq.t
  val reduce :
    ('a -> 'b) ->
    ('a -> 'b -> 'b) -> ('b -> 'c) -> 'a CCLinq.t -> 'c CCLinq.t
  val is_empty : 'a CCLinq.t -> bool CCLinq.t
  val sum : int CCLinq.t -> int CCLinq.t
  val contains : ?eq:'a CCLinq.equal -> 'a -> 'a CCLinq.t -> bool CCLinq.t
  val average : int CCLinq.t -> int CCLinq.t
  val max : int CCLinq.t -> int CCLinq.t
  val min : int CCLinq.t -> int CCLinq.t
  val for_all : ('a -> bool) -> 'a CCLinq.t -> bool CCLinq.t
  val exists : ('a -> bool) -> 'a CCLinq.t -> bool CCLinq.t
  val find : ('a -> bool) -> 'a CCLinq.t -> 'a option CCLinq.t
  val find_map : ('a -> 'b option) -> 'a CCLinq.t -> 'b option CCLinq.t
  val join :
    ?cmp:'key CCLinq.ord ->
    ?eq:'key CCLinq.equal ->
    ?hash:'key CCLinq.hash ->
    ('a -> 'key) ->
    ('b -> 'key) ->
    merge:('key -> 'a -> 'b -> 'c option) ->
    'a CCLinq.t -> 'b CCLinq.t -> 'c CCLinq.t
  val group_join :
    ?cmp:'a CCLinq.ord ->
    ?eq:'a CCLinq.equal ->
    ?hash:'a CCLinq.hash ->
    ('b -> 'a) ->
    'a CCLinq.t -> 'b CCLinq.t -> ('a, 'b list) CCLinq.PMap.t CCLinq.t
  val product : 'a CCLinq.t -> 'b CCLinq.t -> ('a * 'b) CCLinq.t
  val append : 'a CCLinq.t -> 'a CCLinq.t -> 'a CCLinq.t
  val inter :
    ?cmp:'a CCLinq.ord ->
    ?eq:'a CCLinq.equal ->
    ?hash:'a CCLinq.hash -> unit -> 'a CCLinq.t -> 'a CCLinq.t -> 'a CCLinq.t
  val union :
    ?cmp:'a CCLinq.ord ->
    ?eq:'a CCLinq.equal ->
    ?hash:'a CCLinq.hash -> unit -> 'a CCLinq.t -> 'a CCLinq.t -> 'a CCLinq.t
  val diff :
    ?cmp:'a CCLinq.ord ->
    ?eq:'a CCLinq.equal ->
    ?hash:'a CCLinq.hash -> unit -> 'a CCLinq.t -> 'a CCLinq.t -> 'a CCLinq.t
  val fst : ('a * 'b) CCLinq.t -> 'a CCLinq.t
  val snd : ('a * 'b) CCLinq.t -> 'b CCLinq.t
  val map1 : ('a -> 'b) -> ('a * 'c) CCLinq.t -> ('b * 'c) CCLinq.t
  val map2 : ('a -> 'b) -> ('c * 'a) CCLinq.t -> ('c * 'b) CCLinq.t
  val flatten_opt : 'a option CCLinq.t -> 'a CCLinq.t
  val pure : 'a -> 'a CCLinq.t
  val app : ('a -> 'b) CCLinq.t -> 'a CCLinq.t -> 'b CCLinq.t
  val ( <*> ) : ('a -> 'b) CCLinq.t -> 'a CCLinq.t -> 'b CCLinq.t
  val bind : ('a -> 'b CCLinq.t) -> 'a CCLinq.t -> 'b CCLinq.t
  val ( >>= ) : 'a CCLinq.t -> ('a -> 'b CCLinq.t) -> 'b CCLinq.t
  val lazy_ : 'a lazy_t CCLinq.t -> 'a CCLinq.t
  val opt_unwrap : 'a option CCLinq.t -> 'a CCLinq.t
  val reflect : 'a CCLinq.t -> 'a CCLinq.sequence CCLinq.t
  module Infix :
    sig
      val ( >>= ) : 'a CCLinq.t -> ('a -> 'b CCLinq.t) -> 'b CCLinq.t
      val ( >|= ) : 'a CCLinq.t -> ('a -> 'b) -> 'b CCLinq.t
      val ( <*> ) : ('a -> 'b) CCLinq.t -> 'a CCLinq.t -> 'b CCLinq.t
      val ( -- ) : int -> int -> int CCLinq.t
    end
  val to_seq : 'a CCLinq.t -> 'a CCLinq.sequence CCLinq.t
  val to_hashtbl : ('a * 'b) CCLinq.t -> ('a, 'b) Hashtbl.t CCLinq.t
  val to_queue : 'a CCLinq.t -> 'a Queue.t CCLinq.t
  val to_stack : 'a CCLinq.t -> 'a Stack.t CCLinq.t
  module List :
    sig
      val of_list : 'a list -> 'a CCLinq.t
      val to_list : 'a CCLinq.t -> 'a list CCLinq.t
      val run : 'a CCLinq.t -> 'a list
    end
  module Array :
    sig
      val of_array : 'a array -> 'a CCLinq.t
      val to_array : 'a CCLinq.t -> 'a array CCLinq.t
      val run : 'a CCLinq.t -> 'a array
    end
  module AdaptSet :
    functor (S : Set.S) ->
      sig
        val of_set : S.t -> S.elt CCLinq.t
        val to_set : S.elt CCLinq.t -> S.t CCLinq.t
        val run : S.elt CCLinq.t -> S.t
      end
  module AdaptMap :
    functor (M : Map.S) ->
      sig
        val of_map : 'a M.t -> (M.key * 'a) CCLinq.t
        val to_pmap : 'a M.t -> (M.key, 'a) CCLinq.PMap.t
        val to_map : (M.key * 'a) CCLinq.t -> 'a M.t CCLinq.t
        val run : (M.key * 'a) CCLinq.t -> 'a M.t
      end
  module IO :
    sig
      val slurp : Pervasives.in_channel -> string CCLinq.t
      val slurp_file : string -> string CCLinq.t
      val lines : string CCLinq.t -> string CCLinq.t
      val lines' : string CCLinq.t -> string list CCLinq.t
      val join : string -> string CCLinq.t -> string CCLinq.t
      val unlines : string CCLinq.t -> string CCLinq.t
      val out : Pervasives.out_channel -> string CCLinq.t -> unit
      val out_lines : Pervasives.out_channel -> string CCLinq.t -> unit
      val to_file : string -> string CCLinq.t -> unit CCLinq.with_err
      val to_file_exn : string -> string CCLinq.t -> unit
      val to_file_lines : string -> string CCLinq.t -> unit CCLinq.with_err
      val to_file_lines_exn : string -> string CCLinq.t -> unit
    end
end