From caf6d5698c57c355416a528502ddf78bfc6affbb Mon Sep 17 00:00:00 2001 From: "Tamas K. Papp" Date: Thu, 19 Oct 2017 15:51:36 +0200 Subject: [PATCH 1/3] Added methods for Base.length. See discussion at https://github.com/JuliaMath/IntervalSets.jl/issues/21, this should fix the issue. --- src/closed.jl | 6 ++++++ test/runtests.jl | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/closed.jl b/src/closed.jl index 21e6f18..4892747 100644 --- a/src/closed.jl +++ b/src/closed.jl @@ -94,6 +94,11 @@ function width{T}(A::ClosedInterval{T}) max(zero(_width), _width) # this works when T is a Date end +@compat function length{T <: Union{<: Integer, Date}}(A::ClosedInterval{T}) + _width = A.right - A.left + max(zero(_width), _width + oneunit(_width)) +end + function convert{R<:AbstractUnitRange,I<:Integer}(::Type{R}, i::ClosedInterval{I}) R(minimum(i), maximum(i)) end @@ -101,3 +106,4 @@ end range{I<:Integer}(i::ClosedInterval{I}) = convert(UnitRange{I}, i) Base.promote_rule{T1,T2}(::Type{ClosedInterval{T1}}, ::Type{ClosedInterval{T2}}) = ClosedInterval{promote_type(T1, T2)} + diff --git a/test/runtests.jl b/test/runtests.jl index 0ebed0e..0293fdf 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -79,12 +79,17 @@ using Base.Test @test width(ClosedInterval(A, B)) == Base.Dates.Day(59) @test width(ClosedInterval(B, A)) == Base.Dates.Day(0) @test isempty(ClosedInterval(B, A)) + @test length(ClosedInterval(A, B)) == Base.Dates.Day(60) + @test length(ClosedInterval(B, A)) == Base.Dates.Day(0) end @test width(ClosedInterval(3,7)) ≡ 4 @test width(ClosedInterval(4.0,8.0)) ≡ 4.0 @test promote(1..2, 1.0..2.0) === (1.0..2.0, 1.0..2.0) + + @test length(I) == 4 + @test length(J) == 0 end end From 03190aafae4331da845808a2696256c94d4c2cbb Mon Sep 17 00:00:00 2001 From: "Tamas K. Papp" Date: Thu, 19 Oct 2017 18:46:20 +0200 Subject: [PATCH 2/3] Made length return Int. --- src/closed.jl | 7 +++---- test/runtests.jl | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/closed.jl b/src/closed.jl index 4892747..85c1ef7 100644 --- a/src/closed.jl +++ b/src/closed.jl @@ -94,10 +94,9 @@ function width{T}(A::ClosedInterval{T}) max(zero(_width), _width) # this works when T is a Date end -@compat function length{T <: Union{<: Integer, Date}}(A::ClosedInterval{T}) - _width = A.right - A.left - max(zero(_width), _width + oneunit(_width)) -end +length{T <: Integer}(A::ClosedInterval{T}) = max(0, Int(A.right - A.left) + 1) + +length(A::ClosedInterval{Date}) = max(0, Dates.days(A.right - A.left) + 1) function convert{R<:AbstractUnitRange,I<:Integer}(::Type{R}, i::ClosedInterval{I}) R(minimum(i), maximum(i)) diff --git a/test/runtests.jl b/test/runtests.jl index 0293fdf..45fca16 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -79,8 +79,8 @@ using Base.Test @test width(ClosedInterval(A, B)) == Base.Dates.Day(59) @test width(ClosedInterval(B, A)) == Base.Dates.Day(0) @test isempty(ClosedInterval(B, A)) - @test length(ClosedInterval(A, B)) == Base.Dates.Day(60) - @test length(ClosedInterval(B, A)) == Base.Dates.Day(0) + @test length(ClosedInterval(A, B)) ≡ 60 + @test length(ClosedInterval(B, A)) ≡ 0 end @test width(ClosedInterval(3,7)) ≡ 4 From b683d60b6f8b4baa704122ef4b6392a680371de6 Mon Sep 17 00:00:00 2001 From: "Tamas K. Papp" Date: Fri, 20 Oct 2017 11:55:25 +0200 Subject: [PATCH 3/3] Added testing for missing method for non-integer intervals. Suggestion by @timholy. --- test/runtests.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/runtests.jl b/test/runtests.jl index 45fca16..7d8efd5 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -90,6 +90,8 @@ using Base.Test @test length(I) == 4 @test length(J) == 0 + # length deliberately not defined for non-integer intervals + @test_throws MethodError length(1.2..2.4) end end