range
Numeric ranges in V.
Why
-
a..b
in V can only be in increasing order and not in negative order. - Lacks inbuilt
step
which most people need or want. - No support for
float
type. - Solution for
vlang/v#5944
.
Features
- Make
range
easily - Make ranges for
int
and f32
- Positive as well as negative support!
- No need to write the whole for loop! (
this maybe slower than the normal one
) - Use
range
for functional programming - Support iterators. Long ranges without high memory allocation.
- Half open-open ranges
[from,to]
Installation
- Via
git clone
-
git clone https://github.com/Delta456/range
-
- Via
v install
-
v install Delta456.range
-
- Via
vpkg
-
vpkg install range
-
Usage
Use an iterator if you need a large range but don't want to allocate space in memory for all numbers in the range.
import delta456.range
mut iter := range.to_iterator(from: 0, to: 1000000, step: 2)
for v in iter {
println(v)
}
$ v run main.v
0
2
4
Use an array when you need it and the memory allocation for all values in the range is not a problem.
import delta456.range
arr := range.to_array(from: 10, to: 0, step: -1)
println(arr)
v run main.v
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
If you prefer you can use the builder syntax.
mut iter := range.new[int]().from(0).to(10).step(1).to_iterator()
// or
arr := range.new[int]().from(0).to(10).step(1).to_array()
// or
mut iter := range.Builder[int]{ from: 0, to: 10, step: 1 }.to_iterator()
// or
arr := range.Builder[int]{ from: 0, to: 10, step: 1 }.to_array()
The builder is immutable! You can reuse it as many times as you want.
zero_to_nine := range.new[int]().from(0).to(10).step(1)
// print from 0 to 9
for v in zero_to_nine.to_iterator() {
println(v)
}
// print from 0 to 9 again, no problems
for v in zero_to_nine.to_iterator() {
println(v)
}
License
Released under MIT