sig
  type 'a sequence = ('-> unit) -> unit
  type 'a equal = '-> '-> bool
  type 'a ord = '-> '-> int
  type 'a hash = '-> 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 -> '-> 'b option
      val size : ('a, 'b) CCLinq.PMap.t -> int
      val to_seq : ('a, 'b) CCLinq.PMap.t -> ('a * 'b) CCLinq.sequence
      val map :
        ('-> '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:'CCLinq.ord ->
        ?eq:'CCLinq.equal ->
        ?hash:'CCLinq.hash ->
        unit -> ('a, 'b) CCLinq.PMap.t -> ('b, 'a list) CCLinq.PMap.t
      val reverse_multimap :
        ?cmp:'CCLinq.ord ->
        ?eq:'CCLinq.equal ->
        ?hash:'CCLinq.hash ->
        unit -> ('a, 'b list) CCLinq.PMap.t -> ('b, 'a list) CCLinq.PMap.t
      val fold :
        ('acc -> '-> '-> 'acc) -> 'acc -> ('a, 'b) CCLinq.PMap.t -> 'acc
      val fold_multimap :
        ('acc -> '-> '-> 'acc) ->
        'acc -> ('a, 'b list) CCLinq.PMap.t -> 'acc
      val get_seq : '-> ('a, 'b) CCLinq.PMap.t -> 'CCLinq.sequence
      val iter : ('a, 'b) CCLinq.PMap.t -> ('a * 'b) CCLinq.sequence
      val flatten :
        ('a, '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 : 'CCLinq.t
  val start : '-> 'CCLinq.t
  val return : '-> 'CCLinq.t
  val of_list : 'a list -> 'CCLinq.t
  val of_array : 'a array -> '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 : 'CCLinq.sequence -> 'CCLinq.t
  val of_queue : 'Queue.t -> 'CCLinq.t
  val of_stack : 'Stack.t -> 'CCLinq.t
  val of_string : string -> char CCLinq.t
  val run : ?limit:int -> 'CCLinq.t -> 'CCLinq.sequence
  val run1 : 'CCLinq.t -> 'a
  val run_no_optim : ?limit:int -> 'CCLinq.t -> 'CCLinq.sequence
  val map : ('-> 'b) -> 'CCLinq.t -> 'CCLinq.t
  val ( >|= ) : 'CCLinq.t -> ('-> 'b) -> 'CCLinq.t
  val filter : ('-> bool) -> 'CCLinq.t -> 'CCLinq.t
  val size : 'CCLinq.t -> int CCLinq.t
  val choose : 'CCLinq.t -> 'CCLinq.t
  val filter_map : ('-> 'b option) -> 'CCLinq.t -> 'CCLinq.t
  val flat_map : ('-> 'CCLinq.sequence) -> 'CCLinq.t -> 'CCLinq.t
  val flat_map_l : ('-> 'b list) -> 'CCLinq.t -> 'CCLinq.t
  val flatten : 'a list CCLinq.t -> 'CCLinq.t
  val flatten_seq : 'CCLinq.sequence CCLinq.t -> 'CCLinq.t
  val take : int -> 'CCLinq.t -> 'CCLinq.t
  val take_while : ('-> bool) -> 'CCLinq.t -> 'CCLinq.t
  val sort : ?cmp:'CCLinq.ord -> unit -> 'CCLinq.t -> 'CCLinq.t
  val distinct : ?cmp:'CCLinq.ord -> unit -> 'CCLinq.t -> 'CCLinq.t
  val group_by :
    ?cmp:'CCLinq.ord ->
    ?eq:'CCLinq.equal ->
    ?hash:'CCLinq.hash ->
    ('-> 'b) -> 'CCLinq.t -> ('b, 'a list) CCLinq.PMap.t CCLinq.t
  val group_by' :
    ?cmp:'CCLinq.ord ->
    ?eq:'CCLinq.equal ->
    ?hash:'CCLinq.hash ->
    ('-> 'b) -> 'CCLinq.t -> ('b * 'a list) CCLinq.t
  val count :
    ?cmp:'CCLinq.ord ->
    ?eq:'CCLinq.equal ->
    ?hash:'CCLinq.hash ->
    unit -> 'CCLinq.t -> ('a, int) CCLinq.PMap.t CCLinq.t
  val count' :
    ?cmp:'CCLinq.ord -> unit -> 'CCLinq.t -> ('a * int) CCLinq.t
  val fold : ('-> '-> 'b) -> '-> 'CCLinq.t -> 'CCLinq.t
  val reduce :
    ('-> 'b) ->
    ('-> '-> 'b) -> ('-> 'c) -> 'CCLinq.t -> 'CCLinq.t
  val is_empty : 'CCLinq.t -> bool CCLinq.t
  val sum : int CCLinq.t -> int CCLinq.t
  val contains : ?eq:'CCLinq.equal -> '-> '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 : ('-> bool) -> 'CCLinq.t -> bool CCLinq.t
  val exists : ('-> bool) -> 'CCLinq.t -> bool CCLinq.t
  val find : ('-> bool) -> 'CCLinq.t -> 'a option CCLinq.t
  val find_map : ('-> 'b option) -> 'CCLinq.t -> 'b option CCLinq.t
  val join :
    ?cmp:'key CCLinq.ord ->
    ?eq:'key CCLinq.equal ->
    ?hash:'key CCLinq.hash ->
    ('-> 'key) ->
    ('-> 'key) ->
    merge:('key -> '-> '-> 'c option) ->
    'CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
  val group_join :
    ?cmp:'CCLinq.ord ->
    ?eq:'CCLinq.equal ->
    ?hash:'CCLinq.hash ->
    ('-> 'a) ->
    'CCLinq.t -> 'CCLinq.t -> ('a, 'b list) CCLinq.PMap.t CCLinq.t
  val product : 'CCLinq.t -> 'CCLinq.t -> ('a * 'b) CCLinq.t
  val append : 'CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
  val inter :
    ?cmp:'CCLinq.ord ->
    ?eq:'CCLinq.equal ->
    ?hash:'CCLinq.hash -> unit -> 'CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
  val union :
    ?cmp:'CCLinq.ord ->
    ?eq:'CCLinq.equal ->
    ?hash:'CCLinq.hash -> unit -> 'CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
  val diff :
    ?cmp:'CCLinq.ord ->
    ?eq:'CCLinq.equal ->
    ?hash:'CCLinq.hash -> unit -> 'CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
  val fst : ('a * 'b) CCLinq.t -> 'CCLinq.t
  val snd : ('a * 'b) CCLinq.t -> 'CCLinq.t
  val map1 : ('-> 'b) -> ('a * 'c) CCLinq.t -> ('b * 'c) CCLinq.t
  val map2 : ('-> 'b) -> ('c * 'a) CCLinq.t -> ('c * 'b) CCLinq.t
  val flatten_opt : 'a option CCLinq.t -> 'CCLinq.t
  val pure : '-> 'CCLinq.t
  val app : ('-> 'b) CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
  val ( <*> ) : ('-> 'b) CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
  val bind : ('-> 'CCLinq.t) -> 'CCLinq.t -> 'CCLinq.t
  val ( >>= ) : 'CCLinq.t -> ('-> 'CCLinq.t) -> 'CCLinq.t
  val lazy_ : 'a lazy_t CCLinq.t -> 'CCLinq.t
  val opt_unwrap : 'a option CCLinq.t -> 'CCLinq.t
  val reflect : 'CCLinq.t -> 'CCLinq.sequence CCLinq.t
  module Infix :
    sig
      val ( >>= ) : 'CCLinq.t -> ('-> 'CCLinq.t) -> 'CCLinq.t
      val ( >|= ) : 'CCLinq.t -> ('-> 'b) -> 'CCLinq.t
      val ( <*> ) : ('-> 'b) CCLinq.t -> 'CCLinq.t -> 'CCLinq.t
      val ( -- ) : int -> int -> int CCLinq.t
    end
  val to_seq : 'CCLinq.t -> 'CCLinq.sequence CCLinq.t
  val to_hashtbl : ('a * 'b) CCLinq.t -> ('a, 'b) Hashtbl.t CCLinq.t
  val to_queue : 'CCLinq.t -> 'Queue.t CCLinq.t
  val to_stack : 'CCLinq.t -> 'Stack.t CCLinq.t
  module List :
    sig
      val of_list : 'a list -> 'CCLinq.t
      val to_list : 'CCLinq.t -> 'a list CCLinq.t
      val run : 'CCLinq.t -> 'a list
    end
  module Array :
    sig
      val of_array : 'a array -> 'CCLinq.t
      val to_array : 'CCLinq.t -> 'a array CCLinq.t
      val run : '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 : 'M.t -> (M.key * 'a) CCLinq.t
        val to_pmap : 'M.t -> (M.key, 'a) CCLinq.PMap.t
        val to_map : (M.key * 'a) CCLinq.t -> 'M.t CCLinq.t
        val run : (M.key * 'a) CCLinq.t -> '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