package containers

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

LINQ-like operations on collections

The purpose it to provide powerful combinators to express iteration, transformation and combination of collections of items. This module depends on several other modules, including CCList and CCSequence.

Functions and operations are assumed to be referentially transparent, i.e. they should not rely on external side effects, they should not rely on the order of execution.

CCLinq.(
  of_list [1;2;3]
  |> flat_map_l (fun x -> CCList.(x -- (x+10)))
  |> sort ()
  |> count ()
  |> M.to_list
  |> run_exn
);;
- : (int * int) list = [(13, 1); (12, 2); (11, 3); (10, 3); (9, 3);
    (8, 3); (7, 3); (6, 3); (5, 3); (4, 3); (3, 3); (2, 2); (1, 1)]


CCLinq.(
  IO.slurp_file "/tmp/foo"
  |> IO.lines
  |> sort ()
  |> IO.to_file_lines "/tmp/bar"
);;
- :  `Ok ()
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 = [
  1. | `Ok of 'a
  2. | `Error of string
]
type 'a collection

Abstract type of collections of objects of type 'a. Those cannot be used directly, they are to be processed using a query (type 'at) and converted to some list/sequence/array

module PMap : sig ... end

Query operators

type 'a t

Type of a query that returns some value of type 'a

Initial values
val start : 'a -> 'a t

Start with a single value

val of_list : 'a list -> 'a collection t

Query that just returns the elements of the list

val of_array : 'a array -> 'a collection t
val of_array_i : 'a array -> (int * 'a) collection t
val of_hashtbl : ('a, 'b) Hashtbl.t -> ('a * 'b) collection t
val of_seq : 'a sequence -> 'a collection t

Query that returns the elements of the given sequence.

val of_queue : 'a Queue.t -> 'a collection t
val of_stack : 'a Stack.t -> 'a collection t
val of_string : string -> char collection t

Traverse the characters of the string

Execution
val run : 'a t -> 'a with_err

Execute the query, possibly returning an error if things go wrong

val run_exn : 'a t -> 'a

Execute the query, ignoring errors. Can raise an exception if some execution step does.

  • raises Failure

    if the query fails (or returns `Error s)

val run_no_optim : 'a t -> 'a with_err

Run without any optimization

Basics on Collections
val map : ('a -> 'b) -> 'a collection t -> 'b collection t
val filter : ('a -> bool) -> 'a collection t -> 'a collection t
val choose : 'a collection t -> 'a t

Choose one element (if any) in the collection. Fails if the collections is empty

val choose_err : 'a collection t -> 'a with_err t

Choose one element or fail explicitely

val filter_map : ('a -> 'b option) -> 'a collection t -> 'b collection t

Filter and map elements at once

val flat_map : ('a -> 'b collection) -> 'a collection t -> 'b collection t

Monadic "bind", maps each element to a collection and flatten the result

val flat_map_seq : ('a -> 'b sequence) -> 'a collection t -> 'b collection t

Same as flat_map but using sequences

val flat_map_l : ('a -> 'b list) -> 'a collection t -> 'b collection t
val flatten : 'a collection collection t -> 'a collection t
val flatten_l : 'a list collection t -> 'a collection t
val take : int -> 'a collection t -> 'a collection t

take at most n elements

val take_while : ('a -> bool) -> 'a collection t -> 'a collection t

take elements while they satisfy a predicate

val sort : ?cmp:'a ord -> unit -> 'a collection t -> 'a collection t

Sort items by the given comparison function

val distinct : ?cmp:'a ord -> unit -> 'a collection t -> 'a collection t

Remove duplicate elements from the input collection. All elements in the result are distinct.

Queries on Maps
module M : sig ... end
Aggregation
val group_by : ?cmp:'b ord -> ?eq:'b equal -> ?hash:'b hash -> ('a -> 'b) -> 'a collection t -> ('b, 'a list) PMap.t t

group_by f takes a collection c as input, and returns a multimap m such that for each x in c, x occurs in m under the key f x. In other words, f is used to obtain a key from x, and x is added to the multimap using this key.

val group_by' : ?cmp:'b ord -> ?eq:'b equal -> ?hash:'b hash -> ('a -> 'b) -> 'a collection t -> ('b * 'a list) collection t
val count : ?cmp:'a ord -> ?eq:'a equal -> ?hash:'a hash -> unit -> 'a collection t -> ('a, int) PMap.t t

count c returns a map from elements of c to the number of time those elements occur.

val count' : ?cmp:'a ord -> unit -> 'a collection t -> ('a * int) collection t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a collection t -> 'b t

Fold over the collection

val size : _ collection t -> int t

Count how many elements the collection contains

val reduce : ('a -> 'b) -> ('a -> 'b -> 'b) -> ('b -> 'c) -> 'a collection t -> 'c t

reduce start mix stop q uses start on the first element of q, and combine the result with following elements using mix. The final value is transformed using stop.

val reduce_err : ('a -> 'b) -> ('a -> 'b -> 'b) -> ('b -> 'c) -> 'a collection t -> 'c with_err t

Same as reduce but fails explicitely on empty collections.

val is_empty : 'a collection t -> bool t
val sum : int collection t -> int t
val contains : ?eq:'a equal -> 'a -> 'a collection t -> bool t
val average : int collection t -> int t
val max : int collection t -> int t
val min : int collection t -> int t
val average_err : int collection t -> int with_err t
val max_err : int collection t -> int with_err t
val min_err : int collection t -> int with_err t
val for_all : ('a -> bool) -> 'a collection t -> bool t
val exists : ('a -> bool) -> 'a collection t -> bool t
val find : ('a -> bool) -> 'a collection t -> 'a option t
val find_map : ('a -> 'b option) -> 'a collection t -> 'b option t
Binary Operators
val join : ?cmp:'key ord -> ?eq:'key equal -> ?hash:'key hash -> ('a -> 'key) -> ('b -> 'key) -> merge:('key -> 'a -> 'b -> 'c option) -> 'a collection t -> 'b collection t -> 'c collection t

join key1 key2 ~merge is a binary operation that takes two collections a and b, projects their elements resp. with key1 and key2, and combine values (x,y) from (a,b) with the same key using merge. If merge returns None, the combination of values is discarded.

val group_join : ?cmp:'a ord -> ?eq:'a equal -> ?hash:'a hash -> ('b -> 'a) -> 'a collection t -> 'b collection t -> ('a, 'b list) PMap.t t

group_join key2 associates to every element x of the first collection, all the elements y of the second collection such that eq x (key y)

val product : 'a collection t -> 'b collection t -> ('a * 'b) collection t

Cartesian product

val append : 'a collection t -> 'a collection t -> 'a collection t

Append two collections together

val inter : ?cmp:'a ord -> ?eq:'a equal -> ?hash:'a hash -> unit -> 'a collection t -> 'a collection t -> 'a collection t

Intersection of two collections. Each element will occur at most once in the result

val union : ?cmp:'a ord -> ?eq:'a equal -> ?hash:'a hash -> unit -> 'a collection t -> 'a collection t -> 'a collection t

Union of two collections. Each element will occur at most once in the result

val diff : ?cmp:'a ord -> ?eq:'a equal -> ?hash:'a hash -> unit -> 'a collection t -> 'a collection t -> 'a collection t

Set difference

Tuple and Options

Specialized projection operators

val fst : ('a * 'b) collection t -> 'a collection t
val snd : ('a * 'b) collection t -> 'b collection t
val map1 : ('a -> 'b) -> ('a * 'c) collection t -> ('b * 'c) collection t
val map2 : ('a -> 'b) -> ('c * 'a) collection t -> ('c * 'b) collection t
val flatten_opt : 'a option collection t -> 'a collection t

Flatten the collection by removing options

val opt_unwrap : 'a option t -> 'a t

unwrap an option type. Fails if the option value is None

Monad

Careful, those operators do not allow any optimization before running the query, they might therefore be pretty slow.

val bind : ('a -> 'b t) -> 'a t -> 'b t

Use the result of a query to build another query and imediately run it.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

Infix version of bind

val return : 'a -> 'a t

Synonym to start

val query_map : ('a -> 'b) -> 'a t -> 'b t

PMap results directly, rather than collections of elements

Misc
val catch : 'a with_err t -> 'a t

Catch errors within the execution itself. In other words, run (catch q) with succeed with x if q succeeds with `Ok x, and fail if q succeeds with `Error s or if q fails

val lazy_ : 'a lazy_t t -> 'a t
Adapters
val to_array : 'a collection t -> 'a array t

Build an array of results

val to_seq : 'a collection t -> 'a sequence t

Build a (re-usable) sequence of elements, which can then be converted into other structures

val to_hashtbl : ('a * 'b) collection t -> ('a, 'b) Hashtbl.t t

Build a hashtable from the collection

val to_queue : 'a collection t -> ('a Queue.t -> unit) t
val to_stack : 'a collection t -> ('a Stack.t -> unit) t
module L : sig ... end
module AdaptSet (S : Set.S) : sig ... end
module AdaptMap (M : Map.S) : sig ... end
module IO : sig ... end
OCaml

Innovation. Community. Security.