Module CCArray
Array utils
type 'a klist= unit -> [ `Nil | `Cons of 'a * 'a klist ]type 'a gen= unit -> 'a optiontype 'a equal= 'a -> 'a -> booltype 'a ord= 'a -> 'a -> inttype 'a random_gen= Random.State.t -> 'atype 'a printer= Format.formatter -> 'a -> unit
Arrays
include module type of CCShimsArray_
include Array
val length : 'a array -> intval get : 'a array -> int -> 'aval set : 'a array -> int -> 'a -> unitval make : int -> 'a -> 'a arrayval create : int -> 'a -> 'a arrayval create_float : int -> float array
val make_float : int -> float arrayval init : int -> (int -> 'a) -> 'a arrayval make_matrix : int -> int -> 'a -> 'a array arrayval create_matrix : int -> int -> 'a -> 'a array arrayval append : 'a array -> 'a array -> 'a arrayval concat : 'a array list -> 'a arrayval sub : 'a array -> int -> int -> 'a arrayval copy : 'a array -> 'a arrayval fill : 'a array -> int -> int -> 'a -> unitval blit : 'a array -> int -> 'a array -> int -> int -> unitval to_list : 'a array -> 'a listval of_list : 'a list -> 'a arrayval iter : ('a -> unit) -> 'a array -> unitval iteri : (int -> 'a -> unit) -> 'a array -> unitval map : ('a -> 'b) -> 'a array -> 'b arrayval mapi : (int -> 'a -> 'b) -> 'a array -> 'b arrayval fold_left : ('a -> 'b -> 'a) -> 'a -> 'b array -> 'aval fold_right : ('b -> 'a -> 'a) -> 'b array -> 'a -> 'aval iter2 : ('a -> 'b -> unit) -> 'a array -> 'b array -> unitval map2 : ('a -> 'b -> 'c) -> 'a array -> 'b array -> 'c arrayval for_all : ('a -> bool) -> 'a array -> boolval exists : ('a -> bool) -> 'a array -> boolval mem : 'a -> 'a array -> boolval memq : 'a -> 'a array -> boolval sort : ('a -> 'a -> int) -> 'a array -> unitval stable_sort : ('a -> 'a -> int) -> 'a array -> unitval fast_sort : ('a -> 'a -> int) -> 'a array -> unit
val empty : 'a temptyis the empty array, physically equal to||.
val equal : 'a equal -> 'a t equalequal eq a1 a2istrueif the lengths ofa1anda2are the same and if their corresponding elements test equal, usingeq.
val compare : 'a ord -> 'a t ordcompare cmp a1 a2compares arraysa1anda2using the function comparisoncmp.
val swap : 'a t -> int -> int -> unitswap a i jswaps elements at indicesiandj.- since
- 1.4
val get : 'a t -> int -> 'aget a nreturns the element numbernof arraya. The first element has number 0. The last element has numberlength a - 1. You can also writea.(n)instead ofget a n.Raise
Invalid_argument "index out of bounds"ifnis outside the range 0 to(length a - 1).
val get_safe : 'a t -> int -> 'a optionget_safe a ireturnsSome a.(i)ifiis a valid index.- since
- 0.18
val set : 'a t -> int -> 'a -> unitset a n xmodifies arrayain place, replacing element numbernwithx. You can also writea.(n) <- xinstead ofset a n x.Raise
Invalid_argument "index out of bounds"ifnis outside the range 0 tolength a - 1.
val length : _ t -> intlength areturns the length (number of elements) of the given arraya.
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'afold f init acomputesf (... (f (f init a.(0)) a.(1)) ...) a.(n-1), wherenis the length of the arraya.
val foldi : ('a -> int -> 'b -> 'a) -> 'a -> 'b t -> 'afoldi f init ais just likefold, but it also passes in the index of each element as the second argument to the folded functionf.
val fold_while : ('a -> 'b -> 'a * [ `Stop | `Continue ]) -> 'a -> 'b t -> 'afold_while f init afolds left on arrayauntil a stop condition via('a, `Stop)is indicated by the accumulator.- since
- 0.8
val fold_map : ('acc -> 'a -> 'acc * 'b) -> 'acc -> 'a t -> 'acc * 'b tfold_map f init ais afold_left-like function, but it also maps the array to another array.- since
- 1.2, but only
- since
- 2.1 with labels
val scan_left : ('acc -> 'a -> 'acc) -> 'acc -> 'a t -> 'acc tscan_left f init areturns the array[|init; f init x0; f (f init a.(0)) a.(1); …|].- since
- 1.2, but only
- since
- 2.1 with labels
val iter : ('a -> unit) -> 'a t -> unititer f aapplies functionfin turn to all elements ofa. It is equivalent tof a.(0); f a.(1); ...; f a.(length a - 1); ().
val iteri : (int -> 'a -> unit) -> 'a t -> unititeri f ais likeiter, but the functionfis applied with the index of the element as first argument, and the element itself as second argument.
val blit : 'a t -> int -> 'a t -> int -> int -> unitblit a1 o1 a2 o2 lencopieslenelements from arraya1, starting at element numbero1, to arraya2, starting at element numbero2. It works correctly even ifa1anda2are the same array, and the source and destination chunks overlap.Raise
Invalid_argument "CCArray.blit"ifo1andlendo not designate a valid subarray ofa1, or ifo2andlendo not designate a valid subarray ofa2.
val reverse_in_place : 'a t -> unitreverse_in_place areverses the arrayain place.
val sorted : ('a -> 'a -> int) -> 'a t -> 'a arraysorted f amakes a copy ofaand sorts it withf.- since
- 1.0
val sort_indices : ('a -> 'a -> int) -> 'a t -> int arraysort_indices f areturns a new arrayb, with the same length asa, such thatb.(i)is the index at which thei-th element ofsorted f aappears ina.ais not modified.In other words,
map (fun i -> a.(i)) (sort_indices f a) = sorted f a.sort_indicesyields the inverse permutation ofsort_ranking.- since
- 1.0
val sort_ranking : ('a -> 'a -> int) -> 'a t -> int arraysort_ranking f areturns a new arrayb, with the same length asa, such thatb.(i)is the index at which thei-th element ofaappears insorted f a.ais not modified.In other words,
map (fun i -> (sorted f a).(i)) (sort_ranking f a) = a.sort_rankingyields the inverse permutation ofsort_indices.In the absence of duplicate elements in
a, we also havelookup_exn a.(i) (sorted a) = (sorted_ranking a).(i).- since
- 1.0
val find_map : ('a -> 'b option) -> 'a t -> 'b optionfind_map f areturnsSome yif there is an elementxsuch thatf x = Some y. Otherwise returnsNone.- since
- 1.3, but only
- since
- 2.1 with labels
val find : ('a -> 'b option) -> 'a t -> 'b optionval find_map_i : (int -> 'a -> 'b option) -> 'a t -> 'b optionfind_map_i f ais likefind_map, but the index of the element is also passed to the predicate functionf.- since
- 1.3, but only
- since
- 2.1 with labels
val findi : (int -> 'a -> 'b option) -> 'a t -> 'b optionval find_idx : ('a -> bool) -> 'a t -> (int * 'a) optionfind_idx f areturnsSome (i,x)wherexis thei-th element ofa, andf xholds. Otherwise returnsNone.- since
- 0.3.4
val lookup : cmp:'a ord -> 'a -> 'a t -> int optionlookup ~cmp key alookups the index of some keykeyin a sorted arraya. Undefined behavior if the arrayais not sorted wrt~cmp. Complexity:O(log (n))(dichotomic search).- returns
Noneif the keykeyis not present, orSome i(ithe index of the key) otherwise.
val lookup_exn : cmp:'a ord -> 'a -> 'a t -> intlookup_exn ~cmp key ais likelookup, but- raises Not_found
if the key
keyis not present.
val bsearch : cmp:('a -> 'a -> int) -> 'a -> 'a t -> [ `All_lower | `All_bigger | `Just_after of int | `Empty | `At of int ]bsearch ~cmp key afinds the index of the objectkeyin the arraya, providedais 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 arraya(dichotomic search).- returns
`At iifcmp a.(i) key = 0(for some i).`All_lowerif all elements ofaare lower thankey.`All_biggerif all elements ofaare bigger thankey.`Just_after iifa.(i) < key < a.(i+1).`Emptyif the arrayais empty.
- raises Invalid_argument
if the array is found to be unsorted w.r.t
cmp.
- since
- 0.13
val for_all : ('a -> bool) -> 'a t -> boolfor_all f [|a1; ...; an|]istrueif all elements of the array satisfy the predicatef. That is, it returns(f a1) && (f a2) && ... && (f an).
val for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> boolfor_all2 f [|a1; ...; an|] [|b1; ...; bn|]istrueif each pair of elementsai bisatisfies the predicatef. That is, it returns(f a1 b1) && (f a2 b2) && ... && (f an bn).- raises Invalid_argument
if arrays have distinct lengths. Allow different types.
- since
- 0.20
val exists : ('a -> bool) -> 'a t -> boolexists f [|a1; ...; an|]istrueif at least one element of the array satisfies the predicatef. That is, it returns(f a1) || (f a2) || ... || (f an).
val exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> boolexists2 f [|a1; ...; an|] [|b1; ...; bn|]istrueif any pair of elementsai bisatisfies the predicatef. That is, it returns(f a1 b1) || (f a2 b2) || ... || (f an bn).- raises Invalid_argument
if arrays have distinct lengths. Allow different types.
- since
- 0.20
val fold2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a t -> 'b t -> 'accfold2 f init a bfold on two arraysaandbstepwise. It computesf (... (f init a1 b1)...) an bn.- raises Invalid_argument
if
aandbhave distinct lengths.
- since
- 0.20
val iter2 : ('a -> 'b -> unit) -> 'a t -> 'b t -> unititer2 f a biterates on the two arraysaandbstepwise. It is equivalent tof a0 b0; ...; f a.(length a - 1) b.(length b - 1); ().- raises Invalid_argument
if
aandbhave distinct lengths.
- since
- 0.20
val shuffle : 'a t -> unitshuffle arandomly shuffles the arraya, in place.
val shuffle_with : Random.State.t -> 'a t -> unitshuffle_with rs arandomly shuffles the arraya(likeshuffle) but a specialized random statersis used to control the random numbers being produced during shuffling (for reproducibility).
val random_choose : 'a t -> 'a random_genrandom_choose a rsrandomly chooses an element ofa.- raises Not_found
if the array/slice is empty.
val to_string : ?sep:string -> ('a -> string) -> 'a array -> stringto_string ~sep item_to_string aprintato a string usingsepas a separator between elements ofa.- since
- 2.7
val to_iter : 'a t -> 'a iterto_iter areturns aniterof the elements of an arraya. The input arrayais shared with the sequence and modification of it will result in modification of the iterator.- since
- 2.8
val to_std_seq : 'a t -> 'a Seq.tto_std_seq areturns aSeq.tof the elements of an arraya. The input arrayais shared with the sequence and modification of it will result in modification of the sequence.- since
- 2.8
IO
val pp : ?sep:string -> 'a printer -> 'a t printerpp ~sep pp_item ppf aformats the arrayaonppf. Each element is formatted withpp_itemand elements are separated bysep(defaults to ", ").
val pp_i : ?sep:string -> (int -> 'a printer) -> 'a t printerpp_i ~sep pp_item ppf aprints the arrayaonppf. The printing functionpp_itemis giving both index and element. Elements are separated bysep(defaults to ", ").
val map : ('a -> 'b) -> 'a t -> 'b tmap f aapplies functionfto all elements ofa, and builds an array with the results returned byf:[| f a.(0); f a.(1); ...; f a.(length a - 1) |].
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c tmap2 f a bapplies functionfto all elements ofaandb, and builds an array with the results returned byf:[| f a.(0) b.(0); ...; f a.(length a - 1) b.(length b - 1)|].- raises Invalid_argument
if
aandbhave distinct lengths.
- since
- 0.20
val filter : ('a -> bool) -> 'a t -> 'a tfilter f afilters elements out of the arraya. Only the elements satisfying the given predicatefwill be kept.
val filter_map : ('a -> 'b option) -> 'a t -> 'b tfilter_map f [|a1; ...; an|]calls(f a1) ... (f an)and returns an arraybconsisting of all elementsbisuch asf ai = Some bi. WhenfreturnsNone, the corresponding element ofais discarded.
val monoid_product : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c tAll combinaisons of tuples from the two arrays are passed to the function
- since
- 2.8
val flat_map : ('a -> 'b t) -> 'a t -> 'b arrayflat_map f atransforms each element ofainto an array, then flattens.
val except_idx : 'a t -> int -> 'a listexcept_idx a iremoves the element ofaat given indexi, and returns the list of the other elements.
val (--) : int -> int -> int tx -- ycreates an array containing integers in the rangex .. y. Bounds included.
val (--^) : int -> int -> int tx --^ ycreates an array containing integers in the rangex .. y. Right bound excluded.- since
- 0.17
val random : 'a random_gen -> 'a t random_genval random_non_empty : 'a random_gen -> 'a t random_genval random_len : int -> 'a random_gen -> 'a t random_gen
Generic Functions
module type MONO_ARRAY = sig ... endval sort_generic : (module MONO_ARRAY with type elt = 'elt and type t = 'arr) -> cmp:('elt -> 'elt -> int) -> 'arr -> unitsort_generic (module M) ~cmp asorts the arraya, without allocating (eats stack space though). Performance might be lower thanArray.sort.- since
- 0.14
Infix Operators
It is convenient to open CCArray.Infix to access the infix operators without cluttering the scope too much.
- since
- 2.7
module Infix : sig ... endLet operators on OCaml >= 4.08.0, nothing otherwise
- since
- 2.8