fix(vector): make sure Vector.to_{seq,gen} captures the length initially

This commit is contained in:
Simon Cruanes 2023-03-13 13:38:04 -04:00
parent 83009aac10
commit 503c61f72b
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -132,7 +132,7 @@ let resize_with v f size =
v.size <- size v.size <- size
) else ( ) else (
ensure_assuming_not_empty_ v size; ensure_assuming_not_empty_ v size;
let {size=cur_size; vec} = v in let { size = cur_size; vec } = v in
for i = cur_size to size - 1 do for i = cur_size to size - 1 do
Array.unsafe_set vec i (f i) Array.unsafe_set vec i (f i)
done; done;
@ -582,22 +582,24 @@ let to_iter_rev v k =
done done
let to_seq v = let to_seq v =
let { size; vec } = v in
let rec aux i () = let rec aux i () =
if i >= size v then if i >= size then
Seq.Nil Seq.Nil
else else
Seq.Cons (v.vec.(i), aux (i + 1)) Seq.Cons (vec.(i), aux (i + 1))
in in
aux 0 aux 0
let to_seq_rev v = let to_seq_rev v =
let { size; vec } = v in
let rec aux i () = let rec aux i () =
if i < 0 || i > size v then if i < 0 then
Seq.Nil Seq.Nil
else else
Seq.Cons (v.vec.(i), aux (i - 1)) Seq.Cons (vec.(i), aux (i - 1))
in in
aux (size v - 1) aux (size - 1)
let slice_iter v start len = let slice_iter v start len =
assert (start >= 0 && len >= 0); assert (start >= 0 && len >= 0);
@ -655,10 +657,11 @@ let of_gen ?(init = create ()) g =
aux g aux g
let to_gen v = let to_gen v =
let { size; vec } = v in
let i = ref 0 in let i = ref 0 in
fun () -> fun () ->
if !i < v.size then ( if !i < size then (
let x = v.vec.(!i) in let x = vec.(!i) in
incr i; incr i;
Some x Some x
) else ) else