Comments tweaks

This commit is contained in:
JPR 2020-06-16 22:08:57 +02:00
parent 2e04bc9076
commit a6d1ee2667
2 changed files with 84 additions and 84 deletions

View file

@ -35,13 +35,13 @@ val get_safe : 'a t -> int -> 'a option
@since 0.18 *) @since 0.18 *)
val fold : f:('a -> 'b -> 'a) -> init:'a -> 'b t -> 'a val fold : f:('a -> 'b -> 'a) -> init:'a -> 'b t -> 'a
(** [fold ~f ~init a] computes [~f (... (~f (~f ~init a.(0)) a.(1)) ...) a.(n-1)], (** [fold ~f ~init a] computes [f ((f (f init a.(0)) a.(1))) a.(n-1)],
where [n] is the length of the array [a]. where [n] is the length of the array [a].
Same as {!ArrayLabels.fold_left} *) Same as {!ArrayLabels.fold_left} *)
val foldi : f:('a -> int -> 'b -> 'a) -> init:'a -> 'b t -> 'a val foldi : f:('a -> int -> 'b -> 'a) -> init:'a -> 'b t -> 'a
(** [foldi ~f ~init a] is just like {!fold}, but it also passes in the index (** [foldi ~f ~init a] is just like {!fold}, but it also passes in the index
of each element as the second argument to the folded function [~f]. *) of each element as the second argument to the folded function [f]. *)
val fold_while : f:('a -> 'b -> 'a * [`Stop | `Continue]) -> init:'a -> 'b t -> 'a val fold_while : f:('a -> 'b -> 'a * [`Stop | `Continue]) -> init:'a -> 'b t -> 'a
(** [fold_while ~f ~init a] folds left on array [a] until a stop condition via [('a, `Stop)] (** [fold_while ~f ~init a] folds left on array [a] until a stop condition via [('a, `Stop)]
@ -56,7 +56,7 @@ val fold_map : f:('acc -> 'a -> 'acc * 'b) -> init:'acc -> 'a t -> 'acc * 'b t
val scan_left : f:('acc -> 'a -> 'acc) -> init:'acc -> 'a t -> 'acc t val scan_left : f:('acc -> 'a -> 'acc) -> init:'acc -> 'a t -> 'acc t
(** [scan_left ~f ~init a] returns the array (** [scan_left ~f ~init a] returns the array
[ [|~init; ~f ~init x0; ~f (~f ~init a.(0)) a.(1); |] ]. [ [|init; f init x0; f (f init a.(0)) a.(1); |] ].
@since 1.2, but only @since 1.2, but only
@since 2.1 with labels *) @since 2.1 with labels *)
@ -65,24 +65,24 @@ val reverse_in_place : 'a t -> unit
(** [reverse_in_place a] reverses the array [a] in place. *) (** [reverse_in_place a] reverses the array [a] in place. *)
val sorted : f:('a -> 'a -> int) -> 'a t -> 'a array val sorted : f:('a -> 'a -> int) -> 'a t -> 'a array
(** [sorted ~f a] makes a copy of [a] and sorts it with [~f]. (** [sorted ~f a] makes a copy of [a] and sorts it with [f].
@since 1.0 *) @since 1.0 *)
val sort_indices : f:('a -> 'a -> int) -> 'a t -> int array val sort_indices : f:('a -> 'a -> int) -> 'a t -> int array
(** [sort_indices ~f a] returns a new array [b], with the same length as [a], (** [sort_indices ~f a] returns a new array [b], with the same length as [a],
such that [b.(i)] is the index at which the [i]-th element of [sorted ~f a] such that [b.(i)] is the index at which the [i]-th element of [sorted f a]
appears in [a]. [a] is not modified. appears in [a]. [a] is not modified.
In other words, [map (fun i -> a.(i)) (sort_indices ~f a) = sorted ~f a]. In other words, [map (fun i -> a.(i)) (sort_indices f a) = sorted f a].
[sort_indices] yields the inverse permutation of {!sort_ranking}. [sort_indices] yields the inverse permutation of {!sort_ranking}.
@since 1.0 *) @since 1.0 *)
val sort_ranking : f:('a -> 'a -> int) -> 'a t -> int array val sort_ranking : f:('a -> 'a -> int) -> 'a t -> int array
(** [sort_ranking ~f a] returns a new array [b], with the same length as [a], (** [sort_ranking ~f a] returns a new array [b], with the same length as [a],
such that [b.(i)] is the index at which the [i]-th element of [a] appears such that [b.(i)] is the index at which the [i]-th element of [a] appears
in [sorted ~f a]. [a] is not modified. in [sorted f a]. [a] is not modified.
In other words, [map (fun i -> (sorted ~f a).(i)) (sort_ranking ~f a) = a]. In other words, [map (fun i -> (sorted f a).(i)) (sort_ranking f a) = a].
[sort_ranking] yields the inverse permutation of {!sort_indices}. [sort_ranking] yields the inverse permutation of {!sort_indices}.
In the absence of duplicate elements in [a], we also have In the absence of duplicate elements in [a], we also have
@ -96,36 +96,36 @@ val mem : ?eq:('a -> 'a -> bool) -> 'a -> 'a t -> bool
val find_map : f:('a -> 'b option) -> 'a t -> 'b option val find_map : f:('a -> 'b option) -> 'a t -> 'b option
(** [find_map ~f a] returns [Some y] if there is an element [x] such (** [find_map ~f a] returns [Some y] if there is an element [x] such
that [~f x = Some y]. Otherwise returns [None]. that [f x = Some y]. Otherwise returns [None].
@since 1.3, but only @since 1.3, but only
@since 2.1 with labels *) @since 2.1 with labels *)
val find_map_i : f:(int -> 'a -> 'b option) -> 'a t -> 'b option val find_map_i : f:(int -> 'a -> 'b option) -> 'a t -> 'b option
(** [find_map_i ~f a] is like {!find_map}, but the index of the element is also passed (** [find_map_i ~f a] is like {!find_map}, but the index of the element is also passed
to the predicate function [~f]. to the predicate function [f].
@since 1.3, but only @since 1.3, but only
@since 2.1 with labels *) @since 2.1 with labels *)
val find_idx : f:('a -> bool) -> 'a t -> (int * 'a) option val find_idx : f:('a -> bool) -> 'a t -> (int * 'a) option
(** [find_idx ~f a] returns [Some (i,x)] where [x] is the [i]-th element of [a], (** [find_idx ~f a] returns [Some (i,x)] where [x] is the [i]-th element of [a],
and [~f x] holds. Otherwise returns [None]. and [f x] holds. Otherwise returns [None].
@since 0.3.4 *) @since 0.3.4 *)
val lookup : cmp:('a ord [@keep_label]) -> key:'a -> 'a t -> int option val lookup : cmp:('a ord [@keep_label]) -> key:'a -> 'a t -> int option
(** [lookup ~cmp ~key a] lookups the index of some key [~key] in a sorted array [a]. (** [lookup ~cmp ~key a] lookups the index of some key [key] in a sorted array [a].
Undefined behavior if the array [a] is not sorted wrt [~cmp]. Undefined behavior if the array [a] is not sorted wrt [cmp].
Complexity: [O(log (n))] (dichotomic search). Complexity: [O(log (n))] (dichotomic search).
@return [None] if the key [~key] is not present, or @return [None] if the key [key] is not present, or
[Some i] ([i] the index of the key) otherwise. *) [Some i] ([i] the index of the key) otherwise. *)
val lookup_exn : cmp:('a ord [@keep_label]) -> key:'a -> 'a t -> int val lookup_exn : cmp:('a ord [@keep_label]) -> key:'a -> 'a t -> int
(** [lookup_exn ~cmp ~key a] is like {!lookup}, but (** [lookup_exn ~cmp ~key a] is like {!lookup}, but
@raise Not_found if the key [~key] is not present. *) @raise Not_found if the key [key] is not present. *)
val bsearch : cmp:(('a -> 'a -> int) [@keep_label]) -> key:'a -> 'a t -> val bsearch : cmp:(('a -> 'a -> int) [@keep_label]) -> key:'a -> 'a t ->
[ `All_lower | `All_bigger | `Just_after of int | `Empty | `At of int ] [ `All_lower | `All_bigger | `Just_after of int | `Empty | `At of int ]
(** [bsearch ~cmp ~key a] finds the index of the object [~key] in the array [a], (** [bsearch ~cmp ~key a] finds the index of the object [key] in the array [a],
provided [a] is {b sorted} using [~cmp]. If the array is not sorted, provided [a] is {b sorted} using [cmp]. If the array is not sorted,
the result is not specified (may raise Invalid_argument). the result is not specified (may raise Invalid_argument).
Complexity: [O(log n)] where n is the length of the array [a] Complexity: [O(log n)] where n is the length of the array [a]
@ -142,18 +142,18 @@ val bsearch : cmp:(('a -> 'a -> int) [@keep_label]) -> key:'a -> 'a t ->
@since 0.13 *) @since 0.13 *)
val for_all2 : f:('a -> 'b -> bool) -> 'a t -> 'b t -> bool val for_all2 : f:('a -> 'b -> bool) -> 'a t -> 'b t -> bool
(** [for_all2 ~f [|a1; ...; an|] [|b1; ...; bn|]] is [true] if each pair of elements [ai bi] (** [for_all2 ~f [|a1; ⋯; an|] [|b1; ⋯; bn|]] is [true] if each pair of elements [ai bi]
satisfies the predicate [~f]. satisfies the predicate [f].
That is, it returns [(~f a1 b1) && (~f a2 b2) && ... && (~f an bn)]. That is, it returns [(f a1 b1) && (f a2 b2) && && (f an bn)].
@raise Invalid_argument if arrays have distinct lengths. @raise Invalid_argument if arrays have distinct lengths.
Allow different types. Allow different types.
@since 0.20 *) @since 0.20 *)
val exists2 : f:('a -> 'b -> bool) -> 'a t -> 'b t -> bool val exists2 : f:('a -> 'b -> bool) -> 'a t -> 'b t -> bool
(** [exists2 ~f [|a1; ...; an|] [|b1; ...; bn|]] is [true] if any pair of elements [ai bi] (** [exists2 ~f [|a1; ⋯; an|] [|b1; ⋯; bn|]] is [true] if any pair of elements [ai bi]
satisfies the predicate [~f]. satisfies the predicate [f].
That is, it returns [(~f a1 b1) || (~f a2 b2) || ... || (~f an bn)]. That is, it returns [(f a1 b1) || (f a2 b2) || || (f an bn)].
@raise Invalid_argument if arrays have distinct lengths. @raise Invalid_argument if arrays have distinct lengths.
Allow different types. Allow different types.
@ -161,14 +161,14 @@ val exists2 : f:('a -> 'b -> bool) -> 'a t -> 'b t -> bool
val fold2 : f:('acc -> 'a -> 'b -> 'acc) -> init:'acc -> 'a t -> 'b t -> 'acc val fold2 : f:('acc -> 'a -> 'b -> 'acc) -> init:'acc -> 'a t -> 'b t -> 'acc
(** [fold2 ~f ~init a b] fold on two arrays [a] and [b] stepwise. (** [fold2 ~f ~init a b] fold on two arrays [a] and [b] stepwise.
It computes [~f (... (~f ~init a1 b1)...) an bn]. It computes [f ( (f init a1 b1)) an bn].
@raise Invalid_argument if [a] and [b] have distinct lengths. @raise Invalid_argument if [a] and [b] have distinct lengths.
@since 0.20 *) @since 0.20 *)
val iter2 : f:('a -> 'b -> unit) -> 'a t -> 'b t -> unit val iter2 : f:('a -> 'b -> unit) -> 'a t -> 'b t -> unit
(** [iter2 ~f a b] iterates on the two arrays [a] and [b] stepwise. (** [iter2 ~f a b] iterates on the two arrays [a] and [b] stepwise.
It is equivalent to [~f a0 b0; ...; ~f a.(length a - 1) b.(length b - 1); ()]. It is equivalent to [f a0 b0; ; f a.(length a - 1) b.(length b - 1); ()].
@raise Invalid_argument if [a] and [b] have distinct lengths. @raise Invalid_argument if [a] and [b] have distinct lengths.
@since 0.20 *) @since 0.20 *)
@ -218,9 +218,9 @@ val pp_i: ?sep:string -> (int -> 'a printer) -> 'a t printer
Elements are separated by [sep] (defaults to ", "). *) Elements are separated by [sep] (defaults to ", "). *)
val map2 : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t val map2 : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
(** [map2 ~f a b] applies function [~f] to all elements of [a] and [b], (** [map2 ~f a b] applies function [f] to all elements of [a] and [b],
and builds an array with the results returned by [~f]: and builds an array with the results returned by [f]:
[[| ~f a.(0) b.(0); ...; ~f a.(length a - 1) b.(length b - 1)|]]. [[| f a.(0) b.(0); ; f a.(length a - 1) b.(length b - 1)|]].
@raise Invalid_argument if [a] and [b] have distinct lengths. @raise Invalid_argument if [a] and [b] have distinct lengths.
@since 0.20 *) @since 0.20 *)
@ -232,16 +232,16 @@ val rev : 'a t -> 'a t
val filter : f:('a -> bool) -> 'a t -> 'a t val filter : f:('a -> bool) -> 'a t -> 'a t
(** [filter ~f a] filters elements out of the array [a]. Only the elements satisfying (** [filter ~f a] filters elements out of the array [a]. Only the elements satisfying
the given predicate [~f] will be kept. *) the given predicate [f] will be kept. *)
val filter_map : f:('a -> 'b option) -> 'a t -> 'b t val filter_map : f:('a -> 'b option) -> 'a t -> 'b t
(** [filter_map ~f [|a1; ...; an|]] calls [(~f a1) ... (~f an)] and returns an array [b] consisting (** [filter_map ~f [|a1; ⋯; an|]] calls [(f a1)(f an)] and returns an array [b] consisting
of all elements [bi] such as [~f ai = Some bi]. When [~f] returns [None], the corresponding of all elements [bi] such as [f ai = Some bi]. When [f] returns [None], the corresponding
element of [a] is discarded. *) element of [a] is discarded. *)
val monoid_product : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t val monoid_product : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
(** [monoid_product ~f a b] passes all combinaisons of tuples from the two arrays [a] and [b] (** [monoid_product ~f a b] passes all combinaisons of tuples from the two arrays [a] and [b]
to the function [~f]. to the function [f].
@since 2.8 *) @since 2.8 *)
val flat_map : f:('a -> 'b t) -> 'a t -> 'b array val flat_map : f:('a -> 'b t) -> 'a t -> 'b array

View file

@ -24,7 +24,7 @@ val is_empty : _ t -> bool
@since 0.11 *) @since 0.11 *)
val map : f:('a -> 'b) -> 'a t -> 'b t val map : f:('a -> 'b) -> 'a t -> 'b t
(** [map ~f [a0; a1; ⋯ an]] applies function [~f] in turn to [a0; a1; ⋯ an]. (** [map ~f [a0; a1; ⋯ an]] applies function [f] in turn to [[a0; a1; ⋯ an]].
Safe version of {!List.map}. *) Safe version of {!List.map}. *)
val (>|=) : 'a t -> ('a -> 'b) -> 'b t val (>|=) : 'a t -> ('a -> 'b) -> 'b t
@ -50,13 +50,13 @@ val (@) : 'a t -> 'a t -> 'a t
val filter : f:('a -> bool) -> 'a t -> 'a t val filter : f:('a -> bool) -> 'a t -> 'a t
(** [filter ~f l] returns all the elements of the list [l] (** [filter ~f l] returns all the elements of the list [l]
that satisfy the predicate [~f]. The order of the elements that satisfy the predicate [f]. The order of the elements
in the input list [l] is preserved. in the input list [l] is preserved.
Safe version of {!List.filter}. *) Safe version of {!List.filter}. *)
val fold_right : f:('a -> 'b -> 'b) -> 'a t -> init:'b -> 'b val fold_right : f:('a -> 'b -> 'b) -> 'a t -> init:'b -> 'b
(** [fold_right ~f [a1; ⋯ an] ~init] is (** [fold_right ~f [a1; ⋯ an] ~init] is
[~f a1 (~f a2 ( (~f an ~init) ))]. [f a1 (f a2 ( (f an init) ))].
Safe version of {!List.fold_right}. *) Safe version of {!List.fold_right}. *)
val fold_while : f:('a -> 'b -> 'a * [`Stop | `Continue]) -> init:'a -> 'b t -> 'a val fold_while : f:('a -> 'b -> 'a * [`Stop | `Continue]) -> init:'a -> 'b t -> 'a
@ -80,7 +80,7 @@ val fold_on_map : f:('a -> 'b) -> reduce:('acc -> 'b -> 'acc) -> init:'acc -> 'a
@since 2.8 *) @since 2.8 *)
val scan_left : f:('acc -> 'a -> 'acc) -> init:'acc -> 'a list -> 'acc list val scan_left : f:('acc -> 'a -> 'acc) -> init:'acc -> 'a list -> 'acc list
(** [scan_left ~f ~init l] returns the list [[~init; ~f ~init x0; ~f (~f ~init x0) x1; ⋯]] (** [scan_left ~f ~init l] returns the list [[init; f init x0; f (f init x0) x1; ⋯]]
where [x0], [x1], etc. are the elements of [l]. where [x0], [x1], etc. are the elements of [l].
@since 1.2, but only @since 1.2, but only
@since 2.2 with labels *) @since 2.2 with labels *)
@ -111,17 +111,17 @@ val fold_flat_map_i : f:('acc -> int -> 'a -> 'acc * 'b list) -> init:'acc -> 'a
@since 2.8 *) @since 2.8 *)
val count : f:('a -> bool) -> 'a list -> int val count : f:('a -> bool) -> 'a list -> int
(** [count ~f l] counts how many elements of [l] satisfy predicate [~f]. (** [count ~f l] counts how many elements of [l] satisfy predicate [f].
@since 1.5, but only @since 1.5, but only
@since 2.2 with labels *) @since 2.2 with labels *)
val count_true_false : f:('a -> bool) -> 'a list -> int * int val count_true_false : f:('a -> bool) -> 'a list -> int * int
(** [count_true_false ~f l] returns a pair [(int1,int2)] where [int1] is the number of elements in [l] (** [count_true_false ~f l] returns a pair [(int1,int2)] where [int1] is the number of elements in [l]
that satisfy the predicate [~f], and [int2] the number of elements that do not satisfy [~f]. that satisfy the predicate [f], and [int2] the number of elements that do not satisfy [f].
@since 2.4 *) @since 2.4 *)
val init : int -> f:(int -> 'a) -> 'a t val init : int -> f:(int -> 'a) -> 'a t
(** [init len ~f] is [~f 0; ~f 1; ⋯; ~f (len-1)]. (** [init len ~f] is [f 0; f 1; ⋯; f (len-1)].
@raise Invalid_argument if len < 0. @raise Invalid_argument if len < 0.
@since 0.6 *) @since 0.6 *)
@ -181,10 +181,10 @@ val flatten : 'a t t -> 'a t
Safe version of {!List.flatten}. *) Safe version of {!List.flatten}. *)
val product : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t val product : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
(** [product ~f l1 l2] computes the cartesian product of the two lists, with the given combinator [~f]. *) (** [product ~f l1 l2] computes the cartesian product of the two lists, with the given combinator [f]. *)
val fold_product : f:('c -> 'a -> 'b -> 'c) -> init:'c -> 'a t -> 'b t -> 'c val fold_product : f:('c -> 'a -> 'b -> 'c) -> init:'c -> 'a t -> 'b t -> 'c
(** [fold_product ~f ~init l1 l2] applies the function [~f] with the accumulator [~init] on all (** [fold_product ~f ~init l1 l2] applies the function [f] with the accumulator [init] on all
the pair of elements of [l1] and [l2]. Fold on the cartesian product. *) the pair of elements of [l1] and [l2]. Fold on the cartesian product. *)
val cartesian_product : 'a t t -> 'a t t val cartesian_product : 'a t t -> 'a t t
@ -205,7 +205,7 @@ val cartesian_product : 'a t t -> 'a t t
val map_product_l : f:('a -> 'b list) -> 'a list -> 'b list list val map_product_l : f:('a -> 'b list) -> 'a list -> 'b list list
(** [map_product_l ~f l] maps each element of [l] to a list of (** [map_product_l ~f l] maps each element of [l] to a list of
objects of type ['b] using [~f]. objects of type ['b] using [f].
We obtain [[l1;l2;;ln]] where [length l=n] and [li : 'b list]. 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]. Then, it returns all the ways of picking exactly one element per [li].
@since 1.2, but only @since 1.2, but only
@ -217,21 +217,21 @@ val diagonal : 'a t -> ('a * 'a) t
val partition_map : f:('a -> [<`Left of 'b | `Right of 'c | `Drop]) -> val partition_map : f:('a -> [<`Left of 'b | `Right of 'c | `Drop]) ->
'a list -> 'b list * 'c list 'a list -> 'b list * 'c list
(** [partition_map ~f l] maps [~f] on [l] and gather results in lists: (** [partition_map ~f l] maps [f] on [l] and gather results in lists:
- if [~f x = `Left y], adds [y] to the first list. - if [f x = `Left y], adds [y] to the first list.
- if [~f x = `Right z], adds [z] to the second list. - if [f x = `Right z], adds [z] to the second list.
- if [~f x = `Drop], ignores [x]. - if [f x = `Drop], ignores [x].
@since 0.11 *) @since 0.11 *)
val group_by : ?hash:('a -> int) -> ?eq:('a -> 'a -> bool) -> val group_by : ?hash:('a -> int) -> ?eq:('a -> 'a -> bool) ->
'a t -> 'a list t 'a t -> 'a list t
(** [group_by ?hash ?eq l] groups equal elements, regardless of their order of appearance. (** [group_by ?hash ?eq l] groups equal elements, regardless of their order of appearance.
precondition: for any [x] and [y], if [~eq x y] then [~hash x = ~hash y] must hold. precondition: for any [x] and [y], if [eq x y] then [hash x = hash y] must hold.
@since 2.3 *) @since 2.3 *)
val join : join_row:(('a -> 'b -> 'c option) [@keep_label]) -> 'a t -> 'b t -> 'c t val join : join_row:(('a -> 'b -> 'c option) [@keep_label]) -> 'a t -> 'b t -> 'c t
(** [join ~join_row a b] combines every element of [a] with every (** [join ~join_row a b] combines every element of [a] with every
element of [b] using [~join_row]. If [~join_row] returns [None], then element of [b] using [join_row]. If [join_row] returns [None], then
the two elements do not combine. Assume that [b] allows for multiple the two elements do not combine. Assume that [b] allows for multiple
iterations. iterations.
@since 2.3 *) @since 2.3 *)
@ -246,9 +246,9 @@ val join_by : ?eq:('key -> 'key -> bool) -> ?hash:('key -> int) ->
that takes two sequences [a] and [b], projects their that takes two sequences [a] and [b], projects their
elements resp. with [key1] and [key2], and combine elements resp. with [key1] and [key2], and combine
values [(x,y)] from [(a,b)] with the same [key] values [(x,y)] from [(a,b)] with the same [key]
using [~merge]. If [~merge] returns [None], the combination using [merge]. If [merge] returns [None], the combination
of values is discarded. of values is discarded.
precondition: for any [x] and [y], if [~eq x y] then [~hash x = ~hash y] must hold. precondition: for any [x] and [y], if [eq x y] then [hash x = hash y] must hold.
@since 2.3 *) @since 2.3 *)
val join_all_by : ?eq:('key -> 'key -> bool) -> ?hash:('key -> int) -> val join_all_by : ?eq:('key -> 'key -> bool) -> ?hash:('key -> int) ->
@ -263,7 +263,7 @@ val join_all_by : ?eq:('key -> 'key -> bool) -> ?hash:('key -> int) ->
occurring in at least one of them: occurring in at least one of them:
- compute the list [l1] of elements of [a] that map to [k] - compute the list [l1] of elements of [a] that map to [k]
- compute the list [l2] of elements of [b] that map to [k] - compute the list [l2] of elements of [b] that map to [k]
- call [~merge k l1 l2]. If [~merge] returns [None], the combination - call [merge k l1 l2]. If [merge] returns [None], the combination
of values is discarded, otherwise it returns [Some c] of values is discarded, otherwise it returns [Some c]
and [c] is inserted in the result. and [c] is inserted in the result.
@since 2.3 *) @since 2.3 *)
@ -275,10 +275,10 @@ val group_join_by : ?eq:('a -> 'a -> bool) -> ?hash:('a -> int) ->
('a * 'b list) t ('a * 'b list) t
(** [group_join_by ?eq ?hash key la lb] associates to every element [x] of (** [group_join_by ?eq ?hash key la lb] associates to every element [x] of
the first sequence, all the elements [y] of the second the first sequence, all the elements [y] of the second
sequence such that [?eq x (key y)]. Elements of the first sequence such that [eq x (key y)]. Elements of the first
sequences without corresponding values in the second one sequences without corresponding values in the second one
are mapped to [[]] are mapped to [[]]
precondition: for any [x] and [y], if [?eq x y] then [?hash x = ?hash y] must hold. precondition: for any [x] and [y], if [eq x y] then [hash x = hash y] must hold.
@since 2.3 *) @since 2.3 *)
val sublists_of_len : val sublists_of_len :
@ -313,7 +313,7 @@ val sublists_of_len :
@since 1.5 with labels *) @since 1.5 with labels *)
val intersperse : x:'a -> 'a list -> 'a list val intersperse : x:'a -> 'a list -> 'a list
(** [intersperse ~x l] inserts the element [~x] between adjacent elements of the list [l]. (** [intersperse ~x l] inserts the element [x] between adjacent elements of the list [l].
@since 2.1, but only @since 2.1, but only
@since 2.2 with labels *) @since 2.2 with labels *)
@ -354,11 +354,11 @@ val take_drop : int -> 'a t -> 'a t * 'a t
[length l1 = min (length l) n]. *) [length l1 = min (length l) n]. *)
val take_while : f:('a -> bool) -> 'a t -> 'a t val take_while : f:('a -> bool) -> 'a t -> 'a t
(** [take_while ~f l] returns the longest prefix of [l] for which [~f] is [true]. (** [take_while ~f l] returns the longest prefix of [l] for which [f] is [true].
@since 0.13 *) @since 0.13 *)
val drop_while : f:('a -> bool) -> 'a t -> 'a t val drop_while : f:('a -> bool) -> 'a t -> 'a t
(** [drop_while ~f l] drops the longest prefix of [l] for which [~f] is [true]. (** [drop_while ~f l] drops the longest prefix of [l] for which [f] is [true].
@since 0.13 *) @since 0.13 *)
val take_drop_while : f:('a -> bool) -> 'a t -> 'a t * 'a t val take_drop_while : f:('a -> bool) -> 'a t -> 'a t * 'a t
@ -385,8 +385,8 @@ val last_opt : 'a t -> 'a option
@since 0.20 *) @since 0.20 *)
val find_pred : f:('a -> bool) -> 'a t -> 'a option val find_pred : f:('a -> bool) -> 'a t -> 'a option
(** [find_pred ~f l] finds the first element of [l] that satisfies [~f], (** [find_pred ~f l] finds the first element of [l] that satisfies [f],
or returns [None] if no element satisfies [~f]. or returns [None] if no element satisfies [f].
@since 0.11 *) @since 0.11 *)
val find_opt : f:('a -> bool) -> 'a t -> 'a option val find_opt : f:('a -> bool) -> 'a t -> 'a option
@ -400,8 +400,8 @@ val find_pred_exn : f:('a -> bool) -> 'a t -> 'a
@since 0.11 *) @since 0.11 *)
val find_map : f:('a -> 'b option) -> 'a t -> 'b option val find_map : f:('a -> 'b option) -> 'a t -> 'b option
(** [find_map ~f l] traverses [l], applying [~f] to each element. If for (** [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 some element [x], [f x = Some y], then [Some y] is returned. Otherwise
the call returns [None]. the call returns [None].
@since 0.11 *) @since 0.11 *)
@ -411,17 +411,17 @@ val find_mapi : f:(int -> 'a -> 'b option) -> 'a t -> 'b option
val find_idx : f:('a -> bool) -> 'a t -> (int * 'a) option val find_idx : f:('a -> bool) -> 'a t -> (int * 'a) option
(** [find_idx ~f x] returns [Some (i,x)] where [x] is the [i]-th element of [l], (** [find_idx ~f x] returns [Some (i,x)] where [x] is the [i]-th element of [l],
and [~f x] holds. Otherwise returns [None]. *) and [f x] holds. Otherwise returns [None]. *)
val remove : eq:(('a -> 'a -> bool) [@keep_label]) -> key:('a [@keep_label]) -> 'a t -> 'a t val remove : eq:(('a -> 'a -> bool) [@keep_label]) -> key:('a [@keep_label]) -> 'a t -> 'a t
(* FIXME: the original CCList.mli uses ~x instead of ~key !! *) (* FIXME: the original CCList.mli uses ~x instead of ~key !! *)
(** [remove ~eq ~key l] removes every instance of [~key] from [l]. Tail-recursive. (** [remove ~eq ~key l] removes every instance of [key] from [l]. Tail-recursive.
@param eq equality function. @param eq equality function.
@since 0.11 *) @since 0.11 *)
val filter_map : f:('a -> 'b option) -> 'a t -> 'b t val filter_map : f:('a -> 'b option) -> 'a t -> 'b t
(** [filter_map ~f l] is the sublist of [l] containing only elements for which (** [filter_map ~f l] is the sublist of [l] containing only elements for which
[~f] returns [Some e]. [f] returns [Some e].
Map and remove elements at the same time. *) Map and remove elements at the same time. *)
val keep_some : 'a option t -> 'a t val keep_some : 'a option t -> 'a t
@ -449,10 +449,10 @@ val all_ok : ('a, 'err) result t -> ('a t, 'err) result
val sorted_merge : cmp:(('a -> 'a -> int) [@keep_label]) -> 'a list -> 'a list -> 'a list val sorted_merge : cmp:(('a -> 'a -> int) [@keep_label]) -> 'a list -> 'a list -> 'a list
(** [sorted_merge ~cmp l1 l2] merges elements from both sorted list using (** [sorted_merge ~cmp l1 l2] merges elements from both sorted list using
the given comparison function [~cmp]. *) the given comparison function [cmp]. *)
val sort_uniq : cmp:(('a -> 'a -> int) [@keep_label]) -> 'a list -> 'a list val sort_uniq : cmp:(('a -> 'a -> int) [@keep_label]) -> 'a list -> 'a list
(** [sort_uniq ~cmp l] sorts the list [l] using the given comparison function [~cmp] (** [sort_uniq ~cmp l] sorts the list [l] using the given comparison function [cmp]
and remove duplicate elements. *) and remove duplicate elements. *)
val sorted_merge_uniq : cmp:(('a -> 'a -> int) [@keep_label]) -> 'a list -> 'a list -> 'a list val sorted_merge_uniq : cmp:(('a -> 'a -> int) [@keep_label]) -> 'a list -> 'a list -> 'a list
@ -481,36 +481,36 @@ val uniq_succ : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a list -> 'a list
val group_succ : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a list -> 'a list list val group_succ : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a list -> 'a list list
(** [group_succ ~eq l] groups together consecutive elements that are equal (** [group_succ ~eq l] groups together consecutive elements that are equal
according to [~eq]. according to [eq].
@since 0.11 *) @since 0.11 *)
(** {2 Indices} *) (** {2 Indices} *)
val mapi : f:(int -> 'a -> 'b) -> 'a t -> 'b t val mapi : f:(int -> 'a -> 'b) -> 'a t -> 'b t
(** [mapi ~f l] is like {!map}, but the function [~f] is applied to the index of (** [mapi ~f l] is like {!map}, but the function [f] is applied to the index of
the element as first argument (counting from 0), and the element the element as first argument (counting from 0), and the element
itself as second argument. *) itself as second argument. *)
val iteri : f:(int -> 'a -> unit) -> 'a t -> unit val iteri : f:(int -> 'a -> unit) -> 'a t -> unit
(** [iteri ~f l] is like {!iter}, but the function [~f] is applied to the index of (** [iteri ~f l] is like {!iter}, but the function [f] is applied to the index of
the element as first argument (counting from 0), and the element the element as first argument (counting from 0), and the element
itself as second argument. *) itself as second argument. *)
val iteri2 : f:(int -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit val iteri2 : f:(int -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit
(** [iteri2 ~f l1 l2] applies [~f] to the two lists [l1] and [l2] simultaneously. (** [iteri2 ~f l1 l2] applies [f] to the two lists [l1] and [l2] simultaneously.
The integer passed to [~f] indicates the index of element. The integer passed to [f] indicates the index of element.
@raise Invalid_argument when lists do not have the same length. @raise Invalid_argument when lists do not have the same length.
@since 2.0, but only @since 2.0, but only
@since 2.2 with labels *) @since 2.2 with labels *)
val foldi : f:('b -> int -> 'a -> 'b) -> init:'b -> 'a t -> 'b val foldi : f:('b -> int -> 'a -> 'b) -> init:'b -> 'a t -> 'b
(** [foldi ~f ~init l] is like [fold] but it also passes in the index of each element, from [0] to [length l - 1] (** [foldi ~f ~init l] is like [fold] but it also passes in the index of each element, from [0] to [length l - 1]
as additional argument to the folded function [~f]. Tail-recursive. *) as additional argument to the folded function [f]. Tail-recursive. *)
val foldi2 : f:('c -> int -> 'a -> 'b -> 'c) -> init:'c -> 'a t -> 'b t -> 'c val foldi2 : f:('c -> int -> 'a -> 'b -> 'c) -> init:'c -> 'a t -> 'b t -> 'c
(** [foldi2 ~f ~init l1 l2] folds on the two lists [l1] and [l2], (** [foldi2 ~f ~init l1 l2] folds on the two lists [l1] and [l2],
with index of each element passed to the function [~f]. with index of each element passed to the function [f].
Computes [~f( (~f ~init i_0 l1_0 l2_0) ) i_n l1_n l2_n] . Computes [f( (f init i_0 l1_0 l2_0) ) i_n l1_n l2_n] .
@raise Invalid_argument when lists do not have the same length. @raise Invalid_argument when lists do not have the same length.
@since 2.0, but only @since 2.0, but only
@since 2.2 with labels *) @since 2.2 with labels *)
@ -567,33 +567,33 @@ val remove_one : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a -> 'a t -> 'a t
val mem : ?eq:(('a -> 'a -> bool) [@keep_label]) -> 'a -> 'a t -> bool val mem : ?eq:(('a -> 'a -> bool) [@keep_label]) -> 'a -> 'a t -> bool
(** [mem ?eq x l] is [true] iff [x] is equal to an element of [l]. (** [mem ?eq x l] is [true] iff [x] is equal to an element of [l].
A comparator function [~eq] can be provided. Linear time. *) A comparator function [eq] can be provided. Linear time. *)
val subset : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t -> bool val subset : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t -> bool
(** [subset ~eq l1 l2] tests if all elements of the list [l1] are contained (** [subset ~eq l1 l2] tests if all elements of the list [l1] are contained
in the list [l2] by applying [~eq]. *) in the list [l2] by applying [eq]. *)
val uniq : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t val uniq : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t
(** [uniq ~eq l] removes duplicates in [l] w.r.t the equality predicate [~eq]. (** [uniq ~eq l] removes duplicates in [l] w.r.t the equality predicate [eq].
Complexity is quadratic in the length of the list, but the order Complexity is quadratic in the length of the list, but the order
of elements is preserved. If you wish for a faster de-duplication of elements is preserved. If you wish for a faster de-duplication
but do not care about the order, use {!sort_uniq}. *) but do not care about the order, use {!sort_uniq}. *)
val union : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t -> 'a t val union : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t -> 'a t
(** [union ~eq l1 l2] is the union of the lists [l1] and [l2] w.r.t. the equality predicate [~eq]. (** [union ~eq l1 l2] is the union of the lists [l1] and [l2] w.r.t. the equality predicate [eq].
Complexity is product of length of inputs. *) Complexity is product of length of inputs. *)
val inter : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t -> 'a t val inter : eq:(('a -> 'a -> bool) [@keep_label]) -> 'a t -> 'a t -> 'a t
(** [inter ~eq l1 l2] is the intersection of the lists [l1] and [l2] w.r.t. the equality predicate [~eq]. (** [inter ~eq l1 l2] is the intersection of the lists [l1] and [l2] w.r.t. the equality predicate [eq].
Complexity is product of length of inputs. *) Complexity is product of length of inputs. *)
(** {2 Other Constructors} *) (** {2 Other Constructors} *)
val range_by : step:(int [@keep_label]) -> int -> int -> int t val range_by : step:(int [@keep_label]) -> int -> int -> int t
(** [range_by ~step i j] iterates on integers from [i] to [j] included, (** [range_by ~step i j] iterates on integers from [i] to [j] included,
where the difference between successive elements is [~step]. where the difference between successive elements is [step].
Use a negative [~step] for a decreasing list. Use a negative [step] for a decreasing list.
@raise Invalid_argument if [~step=0]. @raise Invalid_argument if [step=0].
@since 0.18 *) @since 0.18 *)
val range : int -> int -> int t val range : int -> int -> int t
@ -642,7 +642,7 @@ module Assoc : sig
val update : val update :
eq:(('a->'a->bool) [@keep_label]) -> f:(('b option -> 'b option) [@keep_label]) -> 'a -> ('a,'b) t -> ('a,'b) t eq:(('a->'a->bool) [@keep_label]) -> f:(('b option -> 'b option) [@keep_label]) -> 'a -> ('a,'b) t -> ('a,'b) t
(** [update ~eq ~f k alist] updates [alist] on the key [k], by calling [~f (get alist k)] (** [update ~eq ~f k alist] updates [alist] on the key [k], by calling [f (get alist k)]
and removing [k] if it returns [None], mapping [k] to [v'] if it and removing [k] if it returns [None], mapping [k] to [v'] if it
returns [Some v']. returns [Some v'].
@since 0.16 *) @since 0.16 *)
@ -731,7 +731,7 @@ module Traverse(M : MONAD) : sig
val map_m : f:('a -> 'b M.t) -> 'a t -> 'b t M.t val map_m : f:('a -> 'b M.t) -> 'a t -> 'b t M.t
val map_m_par : f:('a -> 'b M.t) -> 'a t -> 'b t M.t val map_m_par : f:('a -> 'b M.t) -> 'a t -> 'b t M.t
(** [map_m_par ~f (x :: l)] is like {!map_m} but [~f x] and [~f l] are evaluated (** [map_m_par ~f (x :: l)] is like {!map_m} but [f x] and [f l] are evaluated
"in parallel" before combining their result (for instance in Lwt). *) "in parallel" before combining their result (for instance in Lwt). *)
end end
@ -750,7 +750,7 @@ val random_sequence : 'a random_gen t -> 'a t random_gen
val to_string : ?start:string -> ?stop:string -> ?sep:string -> val to_string : ?start:string -> ?stop:string -> ?sep:string ->
('a -> string) -> 'a t -> string ('a -> string) -> 'a t -> string
(** [to_string ?start ?stop ?sep item_to_string l] print [l] to a string using (** [to_string ?start ?stop ?sep item_to_string l] print [l] to a string using
[?sep] as a separator between elements of [l]. [sep] as a separator between elements of [l].
@since 2.7 *) @since 2.7 *)
val to_iter : 'a t -> 'a iter val to_iter : 'a t -> 'a iter