diff --git a/core/CCVector.ml b/core/CCVector.ml index b4f3c4f7..8f948dc3 100644 --- a/core/CCVector.ml +++ b/core/CCVector.ml @@ -139,6 +139,11 @@ let append a b = a.size <- a.size + b.size ) +(*$T + let v1 = init 5 (fun i->i) and v2 = init 5 (fun i->i+5) in \ + append v1 v2; to_list v1 = CCList.(0--9) +*) + let get v i = if i < 0 || i >= v.size then failwith "Vector.get"; Array.unsafe_get v.vec i @@ -159,8 +164,14 @@ let append_seq a seq = seq (fun x -> push a x) let append_array a b = + ensure a (a.size + Array.length b); Array.iter (push a) b +(*$T + let v1 = init 5 (fun i->i) and v2 = Array.init 5 (fun i->i+5) in \ + append_array v1 v2; to_list v1 = CCList.(0--9) +*) + let equal eq v1 v2 = let n = min v1.size v2.size in let rec check i = @@ -243,6 +254,11 @@ let uniq_sort cmp v = then traverse v.vec.(0) 1 1 (* start at 1, to get the first element in hand *) +(*$T + let v = of_list [1;4;5;3;2;4;1] in \ + uniq_sort Pervasives.compare v; to_list v = [1;2;3;4;5] +*) + let iter k v = for i = 0 to v.size -1 do k (Array.unsafe_get v.vec i) @@ -256,10 +272,18 @@ let iteri k v = let map f v = if _empty_array v then create () - else { - size=v.size; - vec=Array.map f v.vec - } + else ( + let vec = Array.init v.size (fun i -> f (Array.unsafe_get v.vec i)) in + { + size=v.size; + vec; + } + ) + +(*$T + let v = create() in push v 1; push v 2; push v 3; \ + to_list (map string_of_int v) = ["1"; "2"; "3"] + *) let filter' p v = let i = ref (v.size - 1) in @@ -464,6 +488,10 @@ let to_gen v = Some x ) else None +(*$T + let v = (1--10) in to_list v = CCGen.to_list (to_gen v) + *) + let of_klist ?(init=create ()) l = let rec aux l = match l() with | `Nil -> init diff --git a/core/CCVector.mli b/core/CCVector.mli index d3b7a7d3..37cb0677 100644 --- a/core/CCVector.mli +++ b/core/CCVector.mli @@ -90,7 +90,7 @@ val append_seq : ('a, rw) t -> 'a sequence -> unit val equal : 'a equal -> ('a,_) t equal val compare : 'a ord -> ('a,_) t ord -(** Lexicographic comparison *) +(** Total ordering on vectors: Lexicographic comparison. *) val pop : ('a, rw) t -> 'a option (** Remove last element, or [None] *)