107 lines
2.6 KiB
Markdown
107 lines
2.6 KiB
Markdown
# Range
|
|
|
|
Range is diapason between two values. Open range has at least one end open, e.g. ±∞, closed range has both ends open.
|
|
|
|
## Closed ranges
|
|
|
|
The syntax is intuitive and adopted from Kotlin:
|
|
|
|
// end inclusive:
|
|
val r = 1..5
|
|
assert(5 in r)
|
|
assert(6 !in r)
|
|
assert(0 !in r)
|
|
assert(2 in r)
|
|
>>> void
|
|
|
|
Exclusive end ranges are adopted from kotlin either:
|
|
|
|
// end inclusive:
|
|
val r = 1..<5
|
|
assert(5 !in r)
|
|
assert(6 !in r)
|
|
assert(0 !in r)
|
|
assert(2 in r)
|
|
assert(4 in r)
|
|
>>> void
|
|
|
|
In any case, we can test an object to belong to using `in` and `!in` and
|
|
access limits:
|
|
|
|
val r = 0..5
|
|
(r.end - r.start)/2
|
|
>>> 2
|
|
|
|
Notice, start and end are ints, so midpoint here is int too.
|
|
|
|
It is possible to test that one range is included in another range too,
|
|
one range is defined as _contained_ in another ifm and only if, it begin and end
|
|
are equal or within another, taking into account the end-inclusiveness:
|
|
|
|
assert( (1..3) in (1..3) )
|
|
assert( (0..3) !in (1..3) )
|
|
assert( (1..2) in (1..<3) )
|
|
assert( (1..<2) in (1..<3) )
|
|
assert( (1..<3) in (1..3) )
|
|
>>> void
|
|
|
|
## Finite Ranges are iterable
|
|
|
|
So given a range with both ends, you can assume it is [Iterable]. This automatically let
|
|
use finite ranges in loops and convert it to lists:
|
|
|
|
assert( [-2, -1, 0, 1] == (-2..1).toList() )
|
|
>>> void
|
|
|
|
In spite of this you can use ranges in for loops:
|
|
|
|
for( i in 1..3 )
|
|
println(i)
|
|
>>> 1
|
|
>>> 2
|
|
>>> 3
|
|
>>> void
|
|
|
|
but
|
|
|
|
for( i in 1..<3 )
|
|
println(i)
|
|
>>> 1
|
|
>>> 2
|
|
>>> void
|
|
|
|
## Character ranges
|
|
|
|
You can use Char as both ends of the closed range:
|
|
|
|
val r = 'a' .. 'c'
|
|
assert( 'b' in r)
|
|
assert( 'e' !in r)
|
|
for( ch in r )
|
|
println(ch)
|
|
>>> a
|
|
>>> b
|
|
>>> c
|
|
>>> void
|
|
|
|
Exclusive end char ranges are supported too:
|
|
|
|
('a'..<'c').toList
|
|
>>> ['a', 'b']
|
|
|
|
|
|
# Instance members
|
|
|
|
| member | description | args |
|
|
|-----------------|------------------------------|---------------|
|
|
| contains(other) | used in `in` | Range, or Any |
|
|
| isEndInclusive | true for '..' | Bool |
|
|
| isOpen | at any end | Bool |
|
|
| isIntRange | both start and end are Int | Bool |
|
|
| start | | Bool |
|
|
| end | | Bool |
|
|
| size | for finite ranges, see above | Long |
|
|
| [] | see above | |
|
|
| | | |
|
|
|
|
[Iterable]: Iterable.md |