CCArrayLabels
Array utils (Labeled version of CCArray
)
module Floatarray : sig ... end
val empty : 'a t
empty
is the empty array, physically equal to [||]
.
equal eq a1 a2
is true
if the lengths of a1
and a2
are the same and if their corresponding elements test equal, using eq
.
compare cmp a1 a2
compares arrays a1
and a2
using the function comparison cmp
.
val swap : 'a t -> int -> int -> unit
swap a i j
swaps elements at indices i
and j
.
val get_safe : 'a t -> int -> 'a option
get_safe a i
returns Some a.(i)
if i
is a valid index.
val map_inplace : f:('a -> 'a) -> 'a t -> unit
map_inplace ~f a
replace all elements of a
by its image by f
.
val mapi_inplace : f:(int -> 'a -> 'a) -> 'a t -> unit
mapi_inplace ~f a
replace all elements of a
by its image by f
.
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)
, where n
is the length of the array a
. Same as ArrayLabels.fold_left
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 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
fold_while ~f ~init a
folds left on array a
until a stop condition via ('a, `Stop)
is indicated by the accumulator.
fold_map ~f ~init a
is a fold_left
-like function, but it also maps the array to another array.
scan_left ~f ~init a
returns the array [|init; f init x0; f (f init a.(0)) a.(1); …|]
.
val reverse_in_place : 'a t -> unit
reverse_in_place a
reverses the array a
in place.
val sorted : f:('a -> 'a -> int) -> 'a t -> 'a array
sorted ~f a
makes a copy of a
and sorts it with f
.
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
, such that b.(i)
is the index at which the i
-th element of sorted f a
appears in a
. a
is not modified.
In other words, map (fun i -> a.(i)) (sort_indices f a) = sorted f a
. sort_indices
yields the inverse permutation of sort_ranking
.
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
, 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 other words, map (fun i -> (sorted f a).(i)) (sort_ranking f a) = a
. sort_ranking
yields the inverse permutation of sort_indices
.
In the absence of duplicate elements in a
, we also have lookup_exn a.(i) (sorted a) = (sorted_ranking a).(i)
.
val mem : ?eq:('a -> 'a -> bool) -> 'a -> 'a t -> bool
mem ~eq x a
return true if x is present in a
. Linear time.
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 that f x = Some y
. Otherwise returns None
.
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 to the predicate function f
.
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
, and f x
holds. Otherwise returns None
.
val max : cmp:('a -> 'a -> int) -> 'a t -> 'a option
max ~cmp a
returns None
if a
is empty, otherwise, returns Some e
where e
is a maximum element in a
with respect to cmp
.
val argmax : cmp:('a -> 'a -> int) -> 'a t -> int option
argmax ~cmp a
returns None
if a
is empty, otherwise, returns Some i
where i
is the index of a maximum element in a
with respect to cmp
.
val min : cmp:('a -> 'a -> int) -> 'a t -> 'a option
min ~cmp a
returns None
if a
is empty, otherwise, returns Some e
where e
is a minimum element in a
with respect to cmp
.
val argmin : cmp:('a -> 'a -> int) -> 'a t -> int option
argmin ~cmp a
returns None
if a
is empty, otherwise, returns Some i
where i
is the index of a minimum element in a
with respect to cmp
.
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
. Complexity: O(log (n))
(dichotomic search).
val bsearch :
cmp:('a -> 'a -> int) ->
key:'a ->
'a t ->
[ `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
, provided a
is sorted using cmp
. If the array is not sorted, the result is not specified (may raise Invalid_argument).
Complexity: O(log n)
where n is the length of the array a
(dichotomic search).
for_all2 ~f [|a1; …; an|] [|b1; …; bn|]
is true
if each pair of elements ai bi
satisfies the predicate f
. That is, it returns (f a1 b1) && (f a2 b2) && … && (f an bn)
.
exists2 ~f [|a1; …; an|] [|b1; …; bn|]
is true
if any pair of elements ai bi
satisfies the predicate f
. That is, it returns (f a1 b1) || (f a2 b2) || … || (f an bn)
.
fold2 ~f ~init a b
fold on two arrays a
and b
stepwise. It computes f (… (f init a1 b1) …) an bn
.
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); ()
.
val shuffle : 'a t -> unit
shuffle a
randomly shuffles the array a
, in place.
val shuffle_with : Stdlib.Random.State.t -> 'a t -> unit
shuffle_with rs a
randomly shuffles the array a
(like shuffle
) but a specialized random state rs
is used to control the random numbers being produced during shuffling (for reproducibility).
val random_choose : 'a t -> 'a random_gen
random_choose a rs
randomly chooses an element of a
.
to_string ~sep item_to_string a
print a
to a string using sep
as a separator between elements of a
.
to_iter a
returns an iter
of the elements of an array a
. The input array a
is shared with the sequence and modification of it will result in modification of the iterator.
val to_seq : 'a t -> 'a Stdlib.Seq.t
to_seq a
returns a Seq.t
of the elements of an array a
. The input array a
is shared with the sequence and modification of it will result in modification of the sequence. Renamed from to_std_seq
since 3.0.
val pp :
?pp_start:unit printer ->
?pp_stop:unit printer ->
?pp_sep:unit printer ->
'a printer ->
'a t printer
pp ~pp_start ~pp_stop ~pp_sep pp_item ppf a
formats the array a
on ppf
. Each element is formatted with pp_item
, pp_start
is called at the beginning, pp_stop
is called at the end, pp_sep
is called between each elements. By defaults pp_start
and pp_stop
does nothing and pp_sep
defaults to (fun out -> Format.fprintf out ",@ ").
val pp_i :
?pp_start:unit printer ->
?pp_stop:unit printer ->
?pp_sep:unit printer ->
(int -> 'a printer) ->
'a t printer
pp_i ~pp_start ~pp_stop ~pp_sep pp_item ppf a
prints the array a
on ppf
. The printing function pp_item
is giving both index and element. pp_start
is called at the beginning, pp_stop
is called at the end, pp_sep
is called between each elements. By defaults pp_start
and pp_stop
does nothing and pp_sep
defaults to (fun out -> Format.fprintf out ",@ ").
map2 ~f a b
applies function f
to all elements of a
and b
, and builds an array with the results returned by f
: [| f a.(0) b.(0); …; f a.(length a - 1) b.(length b - 1)|]
.
filter ~f a
filters elements out of the array a
. Only the elements satisfying the given predicate f
will be kept.
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 element of a
is discarded.
monoid_product ~f a b
passes all combinaisons of tuples from the two arrays a
and b
to the function f
.
flat_map ~f a
transforms each element of a
into an array, then flattens.
val except_idx : 'a t -> int -> 'a list
except_idx a i
removes the element of a
at given index i
, and returns the list of the other elements.
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
module type MONO_ARRAY = sig ... end
val sort_generic :
(module MONO_ARRAY with type elt = 'elt and type t = 'arr) ->
cmp:('elt -> 'elt -> int) ->
'arr ->
unit
sort_generic (module M) ~cmp a
sorts the array a
, without allocating (eats stack space though). Performance might be lower than Array.sort
.
It is convenient to open CCArray.Infix
to access the infix operators without cluttering the scope too much.
module Infix : sig ... end