Skip to content

Commit 56a55ca

Browse files
authored
Provide range methods for OpenInterval and Interval{:open,:closed} (#193)
* Provide `range` methods for `OpenInterval` and `Interval{:open,:closed}` Methods already exist for ClosedInterval and Interval{:closed,:open}; these new methods complete the set of range extensions for each interval type. * CI: test Julia LTS instead of 1.6 Julia LTS is now at 1.10.5
1 parent 9ee030a commit 56a55ca

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

.github/workflows/CI.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
fail-fast: false
1414
matrix:
1515
version:
16-
- '1.6'
16+
- 'lts'
1717
- '1'
1818
- 'nightly'
1919
os:

src/IntervalSets.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ range(i::TypedEndpointsInterval{:closed,:closed}, length::Integer) = range(i; le
388388
"""
389389
range(i::Interval{:closed,:open}; length)
390390
range(i::Interval{:closed,:open}, length::Integer)
391+
range(i::Interval{:open,:closed}; length)
392+
range(i::Interval{:open,:closed}, length::Integer)
391393
392394
Constructs a range of a specified length with `step=width(i)/length`.
393395
@@ -396,6 +398,9 @@ Constructs a range of a specified length with `step=width(i)/length`.
396398
julia> range(iv"[1, 2)", 7) # Does not contain right endpoint
397399
1.0:0.14285714285714285:1.8571428571428572
398400
401+
julia> range(iv"(1, 2]", 7) # Does not contain left endpoint
402+
1.1428571428571428:0.14285714285714285:2.0
403+
399404
julia> range(1, 2, 8)
400405
1.0:0.14285714285714285:2.0
401406
```
@@ -404,6 +409,32 @@ range(i::TypedEndpointsInterval{:closed,:open}; length::Integer) =
404409
range(leftendpoint(i); step=width(i)/length, length=length)
405410
range(i::TypedEndpointsInterval{:closed,:open}, length::Integer) = range(i; length=length)
406411

412+
range(i::TypedEndpointsInterval{:open,:closed}; length::Integer) =
413+
range(; stop = rightendpoint(i), step = width(i)/length, length)
414+
range(i::TypedEndpointsInterval{:open,:closed}, length::Integer) = range(i; length)
415+
416+
"""
417+
range(i::OpenInterval; length)
418+
range(i::OpenInterval, length::Integer)
419+
420+
Constructs a range of a specified length with `step = width(i) / (length + 1)`.
421+
422+
# Examples
423+
```jldoctest
424+
julia> range(iv"(1, 4)", 5) # Does not contain the endpoints
425+
1.5:0.5:3.5
426+
427+
julia> range(1, 4, 7)
428+
1.0:0.5:4.0
429+
```
430+
"""
431+
function range(i::TypedEndpointsInterval{:open,:open}; length::Integer)
432+
step = width(i) / (length + 1)
433+
range(leftendpoint(i) + step; step, length)
434+
end
435+
436+
range(i::TypedEndpointsInterval{:open,:open}, length::Integer) = range(i; length)
437+
407438
"""
408439
clamp(t, i::ClosedInterval)
409440

test/base_methods.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ end
3030
@test range(0..1; step=1/10) == range(0; stop=1, step=1/10)
3131
@test range(Interval{:closed,:open}(0..1), 10) == range(0; step=1/10, length=10)
3232
@test range(Interval{:closed,:open}(0..1); length=10) == range(0; step=1/10, length=10)
33+
@test range(Interval{:open,:closed}(0..1), 10) == range(; stop=1, step=1/10, length=10)
34+
@test range(Interval{:open,:closed}(0..1); length=10) == range(1/10; step=1/10, length=10)
35+
@test range(OpenInterval(0..1), 7) == range(; stop=7/8, step=1/8, length=7)
36+
@test range(OpenInterval(0..1); length=7) == range(1/8; step=1/8, length=7)
3337
end
3438

3539
@testset "clamp" begin

0 commit comments

Comments
 (0)