package nonstd
Library
Module
Module type
Parameter
Class
Class type
include module type of struct include ListLabels end
Compare the lengths of two lists. compare_lengths l1 l2
is equivalent to compare (length l1) (length l2)
, except that the computation stops after reaching the end of the shortest list.
Compare the length of a list to an integer. compare_length_with l len
is equivalent to compare (length l) len
, except that the computation stops after at most len
iterations on the list.
Return the n
-th element of the given list. The first element (head of the list) is at position 0. Return None
if the list is too short.
rev_append l1 l2
reverses l1
and concatenates it with l2
. This is equivalent to (
rev
l1) @ l2
, but rev_append
is tail-recursive and more efficient.
Concatenate a list of lists. The elements of the argument are all concatenated together (in the same order) to give the result. Not tail-recursive (length of the argument + length of the longest sub-list).
Same as concat
. Not tail-recursive (length of the argument + length of the longest sub-list).
Comparison
equal eq [a1; ...; an] [b1; ..; bm]
holds when the two input lists have the same length, and for each pair of elements ai
, bi
at the same position we have eq ai bi
.
Note: the eq
function may be called even if the lists have different length. If you know your equality function is costly, you may want to check compare_lengths
first.
compare cmp [a1; ...; an] [b1; ...; bm]
performs a lexicographic comparison of the two input lists, using the same 'a -> 'a -> int
interface as Stdlib.compare
:
a1 :: l1
is smaller thana2 :: l2
(negative result) ifa1
is smaller thana2
, or if they are equal (0 result) andl1
is smaller thanl2
- the empty list
[]
is strictly smaller than non-empty lists
Note: the cmp
function will be called even if the lists have different lengths.
Iterators
fold_left_map
is a combination of fold_left
and map
that threads an accumulator through calls to f
.
Iterators on two lists
iter2 ~f [a1; ...; an] [b1; ...; bn]
calls in turn f a1 b1; ...; f an bn
.
map2 ~f [a1; ...; an] [b1; ...; bn]
is [f a1 b1; ...; f an bn]
.
fold_left2 ~f ~init [a1; ...; an] [b1; ...; bn]
is f (... (f (f init a1 b1) a2 b2) ...) an bn
.
fold_right2 ~f [a1; ...; an] [b1; ...; bn] ~init
is f a1 b1 (f a2 b2 (... (f an bn init) ...))
.
List scanning
Same as for_all
, but for a two-argument predicate.
Same as exists
, but for a two-argument predicate.
mem a ~set
is true if and only if a
is equal to an element of set
.
Same as mem
, but uses physical equality instead of structural equality to compare list elements.
List searching
find ~f l
returns the first element of the list l
that satisfies the predicate f
. Returns None
if there is no value that satisfies f
in the list l
.
find_all
is another name for filter
.
partition ~f l
returns a pair of lists (l1, l2)
, where l1
is the list of all the elements of l
that satisfy the predicate f
, and l2
is the list of all the elements of l
that do not satisfy f
. The order of the elements in the input list is preserved.
Association lists
assoc_opt a l
returns the value associated with key a
in the list of pairs l
. That is, assoc_opt a [ ...; (a,b); ...] = Some b
if (a,b)
is the leftmost binding of a
in list l
. Returns None
if there is no value associated with a
in the list l
.
Same as assoc_opt
, but uses physical equality instead of structural equality to compare keys.
Lists of pairs
Transform a list of pairs into a pair of lists: split [(a1,b1); ...; (an,bn)]
is ([a1; ...; an], [b1; ...; bn])
. Not tail-recursive.
Transform a pair of lists into a list of pairs: combine [a1; ...; an] [b1; ...; bn]
is [(a1,b1); ...; (an,bn)]
.
Sorting
Sort a list in increasing order according to a comparison function. The comparison function must return 0 if its arguments compare as equal, a positive integer if the first is greater, and a negative integer if the first is smaller (see Array.sort for a complete specification). For example, Stdlib.compare
is a suitable comparison function. The resulting list is sorted in increasing order. sort
is guaranteed to run in constant heap space (in addition to the size of the result list) and logarithmic stack space.
The current implementation uses Merge Sort. It runs in constant heap space and logarithmic stack space.
Same as sort
, but the sorting algorithm is guaranteed to be stable (i.e. elements that compare equal are kept in their original order).
The current implementation uses Merge Sort. It runs in constant heap space and logarithmic stack space.
Same as sort
or stable_sort
, whichever is faster on typical input.
Same as sort
, but also remove duplicates.
Lists and Sequences
val to_seq : 'a list -> 'a Seq.t
Iterate on the list.
val of_seq : 'a Seq.t -> 'a list
Create a list from a sequence.
val hd : 'a t -> 'b option
val tl : 'a t -> 'b list option
val nth : 'a t -> int -> 'b option
val nth_exn : 'a t -> int -> 'b
val filter : 'a t -> f:('a -> bool) -> 'b list
val find_map : 'a t -> f:('b -> 'c option) -> 'd option
val find : 'a t -> f:('b -> bool) -> 'c option
val findi : 'a t -> f:(int -> 'b -> bool) -> (int * 'c) option
changing the order of arguments on some standard List
functions.
Tail recursive versions of standard List
module
val reduce : 'a t -> f:('b -> 'c -> 'b) -> 'd option
val concat_map : 'a t -> f:('b -> 'c list) -> 'd list
val concat_mapi : 'a t -> f:(int -> 'b -> 'c list) -> 'd list
val last : 'a t -> 'b option
val remove_consecutive_duplicates : 'a t -> equal:('b -> 'c -> bool) -> 'd list
val init : int -> f:(int -> 'a) -> 'b t
val filter_map : 'a t -> f:('a -> 'b option) -> 'c list
val filter_opt : 'a option t -> 'a list
val partition_map :
'a t ->
f:('b -> [< `Fst of 'c | `Snd of 'd ]) ->
'e list * 'f list
val take_while : 'a t -> f:('a -> bool) -> 'a list
module Assoc : sig ... end