include module type of List
Safe version of List.filter.
filter p l
returns all the elements of the list l
that satisfy the predicate p
. The order of the elements
in the input list is preserved.
val fold_right : ('a ‑> 'b ‑> 'b) ‑> 'a t ‑> 'b ‑> 'b
Safe version of fold_right
.
fold_right f [a1; ...; an] b
is
f a1 (f a2 (... (f an b) ...))
. Not tail-recursive.
val fold_while : ('a ‑> 'b ‑> 'a * [ `Stop | `Continue ]) ‑> 'a ‑> 'b t ‑> 'a
Fold until a stop condition via ('a, `Stop)
is
indicated by the accumulator.
val fold_map : ('acc ‑> 'a ‑> 'acc * 'b) ‑> 'acc ‑> 'a list ‑> 'acc * 'b list
fold_map f acc l
is a fold_left
-like function, but it also maps the
list to another list.
val scan_left : ('acc ‑> 'a ‑> 'acc) ‑> 'acc ‑> 'a list ‑> 'acc list
scan_left f acc l
returns the list [acc; f acc x0; f (f acc x0) x1; ...]
where x0
, x1
, etc. are the elements of l
.
val fold_map2 : ('acc ‑> 'a ‑> 'b ‑> 'acc * 'c) ‑> 'acc ‑> 'a list ‑> 'b list ‑> 'acc * 'c list
fold_map2
is to fold_map
what List.map2
is to List.map
.
val fold_filter_map : ('acc ‑> 'a ‑> 'acc * 'b option) ‑> 'acc ‑> 'a list ‑> 'acc * 'b list
fold_filter_map f acc l
is a fold_left
-like function, but also
generates a list of output in a way similar to filter_map.
val fold_flat_map : ('acc ‑> 'a ‑> 'acc * 'b list) ‑> 'acc ‑> 'a list ‑> 'acc * 'b list
fold_flat_map f acc l
is a fold_left
-like function, but it also maps the
list to a list of lists that is then flatten
'd.
val count : ('a ‑> bool) ‑> 'a list ‑> int
count f l
counts how much elements of l
comply with the function f
.
val init : int ‑> (int ‑> 'a) ‑> 'a t
init len f
is f 0; f 1; ...; f (len-1)
.
val combine : 'a list ‑> 'b list ‑> ('a * 'b) list
Like List.combine but tail-recursive.
Transform a pair of lists into a list of pairs:
combine [a1; ...; an] [b1; ...; bn]
is
[(a1,b1); ...; (an,bn)]
.
val combine_gen : 'a list ‑> 'b list ‑> ('a * 'b) gen
A tail-recursive version of List.split.
Transform a list of pairs into a pair of lists:
split [(a1,b1); ...; (an,bn)]
is ([a1; ...; an], [b1; ...; bn])
.
Equivalent to compare (length l1) (length l2)
but more efficient.
Compare the lengths of two lists.
val compare_length_with : 'a t ‑> int ‑> int
Equivalent to compare (length l) x
but more efficient.
Compare the length of a list to an integer.
Produce the cartesian product of this list of lists, by returning all the ways of picking one element per sublist. NOTE the order of the returned list is unspecified. For example:
# cartesian_product [[1;2];[3];[4;5;6]] |> sort =
[[1;3;4];[1;3;5];[1;3;6];[2;3;4];[2;3;5];[2;3;6]];;
# cartesian_product [[1;2];[];[4;5;6]] = [];;
# cartesian_product [[1;2];[3];[4];[5];[6]] |> sort =
[[1;3;4;5;6];[2;3;4;5;6]];;
invariant: cartesian_product l = map_product id l
.
val map_product_l : ('a ‑> 'b list) ‑> 'a list ‑> 'b list list
map_product_l f l
maps each element of l
to a list of
objects of type 'b
using f
.
We obtain [l1;l2;...;ln]
where length l=n
and li : 'b list
.
Then, it returns all the ways of picking exactly one element per li
.
All pairs of distinct positions of the list. list_diagonal l
will
return the list of List.nth i l, List.nth j l
if i < j
.
val partition_map : ('a ‑> [< `Left of 'b | `Right of 'c | `Drop ]) ‑> 'a list ‑> 'b list * 'c list
partition_map f l
maps f
on l
and gather results in lists:
f x = `Left y
, adds y
to the first list.f x = `Right z
, adds z
to the second list.f x = `Drop
, ignores x
.val sublists_of_len : ?last:('a list ‑> 'a list option) ‑> ?offset:int ‑> int ‑> 'a list ‑> 'a list list
sublists_of_len n l
returns sub-lists of l
that have length n
.
By default, these sub-lists are non overlapping:
sublists_of_len 2 [1;2;3;4;5;6]
returns [1;2]; [3;4]; [5;6]
.
Examples:
sublists_of_len 2 [1;2;3;4;5;6] = [[1;2]; [3;4]; [5;6]]
.sublists_of_len 2 ~offset:3 [1;2;3;4;5;6] = [1;2];[4;5]
.sublists_of_len 3 ~last:CCOpt.return [1;2;3;4] = [1;2;3];[4]
.sublists_of_len 2 [1;2;3;4;5] = [[1;2]; [3;4]]
.n
. If offset < n
, the sub-lists
will overlap; if offset > n
, some elements will not appear at all.g
is such
that length g < n
, last g
is called. If last g = Some g'
,
g'
is appended; otherwise g
is dropped.
If last = CCOpt.return
, it will simply keep the last group.
By default, last = fun _ -> None
, i.e. the last group is dropped if shorter than n
.offset <= 0
or n <= 0
.val intersperse : 'a ‑> 'a list ‑> 'a list
Insert the first argument between every element of the list.
val interleave : 'a list ‑> 'a list ‑> 'a list
interleave [x1…xn] [y1…ym]
is x1,y1,x2,y2,…
and finishes with
the suffix of the longest list.
val find_pred : ('a ‑> bool) ‑> 'a t ‑> 'a option
find_pred p l
finds the first element of l
that satisfies p
,
or returns None
if no element satisfies p
.
val find_pred_exn : ('a ‑> bool) ‑> 'a t ‑> 'a
Unsafe version of find_pred.
val find_map : ('a ‑> 'b option) ‑> 'a t ‑> 'b option
find_map f l
traverses l
, applying f
to each element. If for
some element x
, f x = Some y
, then Some y
is returned. Otherwise
the call returns None
.
val find_mapi : (int ‑> 'a ‑> 'b option) ‑> 'a t ‑> 'b option
Like find_map, but also pass the index to the predicate function.
val find_idx : ('a ‑> bool) ‑> 'a t ‑> (int * 'a) option
find_idx p x
returns Some (i,x)
where x
is the i
-th element of l
,
and p x
holds. Otherwise returns None
.
remove ~x l
removes every instance of x
from l
. Tail-recursive.
filter_map f l
is the sublist of l
containing only elements for which
f
returns Some e
.
Map and remove elements at the same time.
all_some l
returns Some l'
if all elements of l
are of the form Some x
,
or None
otherwise.
all_ok l
returns Ok l'
if all elements of l
are of the form Ok x
,
or Error e
otherwise (with the first error met).
val sorted_merge : cmp:('a ‑> 'a ‑> int) ‑> 'a list ‑> 'a list ‑> 'a list
Merge elements from both sorted list.
val sort_uniq : cmp:('a ‑> 'a ‑> int) ‑> 'a list ‑> 'a list
Sort the list and remove duplicate elements.
val sorted_merge_uniq : cmp:('a ‑> 'a ‑> int) ‑> 'a list ‑> 'a list ‑> 'a list
sorted_merge_uniq l1 l2
merges the sorted lists l1
and l2
and
removes duplicates.
val is_sorted : cmp:('a ‑> 'a ‑> int) ‑> 'a list ‑> bool
is_sorted l
returns true
iff l
is sorted (according to given order).
Pervasives.compare
).val sorted_insert : cmp:('a ‑> 'a ‑> int) ‑> ?uniq:bool ‑> 'a ‑> 'a list ‑> 'a list
sorted_insert x l
inserts x
into l
such that, if l
was sorted,
then sorted_insert x l
is sorted too.
x
is already in sorted position in l
, then
x
is not duplicated. Default false
(x
will be inserted in any case).val uniq_succ : eq:('a ‑> 'a ‑> bool) ‑> 'a list ‑> 'a list
uniq_succ l
removes duplicate elements that occur one next to the other.
Examples:
uniq_succ [1;2;1] = [1;2;1]
.
uniq_succ [1;1;2] = [1;2]
.
val group_succ : eq:('a ‑> 'a ‑> bool) ‑> 'a list ‑> 'a list list
group_succ ~eq l
groups together consecutive elements that are equal
according to eq
.
Like map, but the function is applied to the index of the element as first argument (counting from 0), and the element itself as second argument.
val iteri : (int ‑> 'a ‑> unit) ‑> 'a t ‑> unit
Like iter, but the function is applied to the index of the element as first argument (counting from 0), and the element itself as second argument.
val foldi : ('b ‑> int ‑> 'a ‑> 'b) ‑> 'b ‑> 'a t ‑> 'b
Like fold
but it also passes in the index of each element to the folded function. Tail-recursive.
Fold on two lists, with index.
val get_at_idx : int ‑> 'a t ‑> 'a option
Get by index in the list. If the index is negative, it will get element starting from the end of the list.
val nth_opt : 'a t ‑> int ‑> 'a option
Safe version of nth.
val get_at_idx_exn : int ‑> 'a t ‑> 'a
Get the i-th element, or
Set i-th element (removes the old one), or does nothing if index is too high. If the index is negative, it will set element starting from the end of the list.
Insert at i-th position, between the two existing elements. If the index is too high, append at the end of the list. If the index is negative, it will insert element starting from the end of the list.
Remove element at given index. Does nothing if the index is too high. If the index is negative, it will remove element starting from the end of the list.
Those operations maintain the invariant that the list does not contain duplicates (if it already satisfies it).
Remove duplicates w.r.t the equality predicate. Complexity is quadratic in the length of the list, but the order of elements is preserved. If you wish for a faster de-duplication but do not care about the order, use sort_uniq.
val range_by : step:int ‑> int ‑> int ‑> int t
range_by ~step i j
iterates on integers from i
to j
included,
where the difference between successive elements is step
.
Use a negative step
for a decreasing list.
step=0
.val range : int ‑> int ‑> int t
range i j
iterates on integers from i
to j
included. It works
both for decreasing and increasing ranges.
val range' : int ‑> int ‑> int t
Like range but the second bound is excluded.
For instance range' 0 5 = [0;1;2;3;4]
.
module Assoc : sig ... end
module Ref : sig ... end
val random : 'a random_gen ‑> 'a t random_gen
val random_non_empty : 'a random_gen ‑> 'a t random_gen
val random_len : int ‑> 'a random_gen ‑> 'a t random_gen
val random_choose : 'a t ‑> 'a random_gen
Randomly choose an element in the list.
val random_sequence : 'a random_gen t ‑> 'a t random_gen
Build a list from a given sequence
.
In the result, elements appear in the same order as they did in the source sequence
.
Build a list from a given gen
.
In the result, elements appear in the same order as they did in the source gen
.
Build a list from a given klist
.
In the result, elements appear in the same order as they did in the source klist
.
It is convenient to open CCList.Infix to access the infix operators without cluttering the scope too much.
module Infix : sig ... end