diff --git a/src/Intervals.jl b/src/Intervals.jl index 0c606436..0a66b81a 100644 --- a/src/Intervals.jl +++ b/src/Intervals.jl @@ -10,6 +10,12 @@ using Dates: AbstractDateTime, value, coarserperiod import Base: ⊆, ⊇, ⊈, ⊉, union, union!, merge +# Extend `Base.isdisjoint` when it exists +# https://github.com/JuliaLang/julia/pull/34427 +if VERSION >= v"1.5.0-DEV.124" + import Base: isdisjoint +end + abstract type Bound end abstract type Bounded <: Bound end struct Closed <: Bounded end @@ -57,6 +63,7 @@ export Bound, union!, less_than_disjoint, greater_than_disjoint, + isdisjoint, superset, .., ≪, ≫, ⊆, ⊇, ⊈, ⊉ end diff --git a/src/interval.jl b/src/interval.jl index 198d0847..eba28e68 100644 --- a/src/interval.jl +++ b/src/interval.jl @@ -378,6 +378,10 @@ function Base.issubset(a::AbstractInterval, b::AbstractInterval) return LeftEndpoint(a) ≥ LeftEndpoint(b) && RightEndpoint(a) ≤ RightEndpoint(b) end +function isdisjoint(a::AbstractInterval, b::AbstractInterval) + return RightEndpoint(a) < LeftEndpoint(b) || LeftEndpoint(a) > RightEndpoint(b) +end + Base.:⊈(a::AbstractInterval, b::AbstractInterval) = !issubset(a, b) Base.:⊉(a::AbstractInterval, b::AbstractInterval) = !issubset(b, a) diff --git a/test/comparisons.jl b/test/comparisons.jl index a2f1b93d..3b25de32 100644 --- a/test/comparisons.jl +++ b/test/comparisons.jl @@ -70,6 +70,9 @@ end @test !issubset(earlier, later) @test !issubset(later, earlier) + @test isdisjoint(earlier, later) + @test isdisjoint(later, earlier) + @test intersect(earlier, later) == expected_overlap @test_throws ArgumentError merge(earlier, later) @test union([earlier, later]) == [earlier, later] @@ -125,6 +128,9 @@ end @test !issubset(earlier, later) @test !issubset(later, earlier) + @test isdisjoint(earlier, later) + @test isdisjoint(later, earlier) + @test intersect(earlier, later) == expected_overlap @test_throws ArgumentError merge(earlier, later) @test union([earlier, later]) == [earlier, later] @@ -180,6 +186,9 @@ end @test !issubset(earlier, later) @test !issubset(later, earlier) + @test isdisjoint(earlier, later) + @test isdisjoint(later, earlier) + @test intersect(earlier, later) == expected_overlap @test merge(earlier, later) == expected_superset @test union([earlier, later]) == [expected_superset] @@ -235,6 +244,9 @@ end @test !issubset(earlier, later) @test !issubset(later, earlier) + @test isdisjoint(earlier, later) + @test isdisjoint(later, earlier) + @test intersect(earlier, later) == expected_overlap @test merge(earlier, later) == expected_superset @test union([earlier, later]) == [expected_superset] @@ -290,6 +302,9 @@ end @test !issubset(earlier, later) @test !issubset(later, earlier) + @test !isdisjoint(earlier, later) + @test !isdisjoint(later, earlier) + @test intersect(earlier, later) == expected_overlap @test merge(earlier, later) == expected_superset @test union([earlier, later]) == [expected_superset] @@ -345,6 +360,9 @@ end @test !issubset(earlier, later) @test !issubset(later, earlier) + @test !isdisjoint(earlier, later) + @test !isdisjoint(later, earlier) + @test intersect(earlier, later) == expected_overlap @test merge(earlier, later) == expected_superset @test union([earlier, later]) == [expected_superset] @@ -388,6 +406,9 @@ end @test issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -431,6 +452,9 @@ end @test !issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -474,6 +498,9 @@ end @test !issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -517,6 +544,9 @@ end @test !issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -560,6 +590,9 @@ end @test issubset(a, b) @test !issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -603,6 +636,9 @@ end @test issubset(a, b) @test !issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -646,6 +682,9 @@ end @test issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -689,6 +728,9 @@ end @test !issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -732,6 +774,9 @@ end @test !issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -774,6 +819,9 @@ end @test issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -808,6 +856,9 @@ end @test issubset(a, b) @test issubset(b, a) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(a, b) == expected_overlap @test merge(a, b) == expected_superset @test union([a, b]) == [expected_superset] @@ -870,6 +921,9 @@ end @test issubset(smaller, larger) @test !issubset(larger, smaller) + @test !isdisjoint(a, b) + @test !isdisjoint(b, a) + @test intersect(smaller, larger) == expected_overlap @test merge(smaller, larger) == expected_superset @test union([smaller, larger]) == [expected_superset]