Skip to content

Additional accessor and convert functions #108

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Intervals.jl
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ export Bound,
HB,
first,
last,
containsfirst,
containslast,
span,
bounds_types,
isclosed,
Expand Down
6 changes: 6 additions & 0 deletions src/interval.jl
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ Base.first(interval::Interval) = interval.first
Base.last(interval::Interval) = interval.last
isclosed(interval::AbstractInterval{T,L,R}) where {T,L,R} = L === Closed && R === Closed
Base.isopen(interval::AbstractInterval{T,L,R}) where {T,L,R} = L === Open && R === Open
containsfirst(interval::AbstractInterval{T,L,R}) where {T,L,R} = L === Closed
containslast(interval::AbstractInterval{T,L,R}) where {T,L,R} = R === Closed
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this functionality is useful but the name needs more consideration. There may be a rename of first/last in the near future: #90


"""
span(interval::AbstractInterval)
Expand All @@ -137,6 +139,10 @@ function Base.convert(::Type{T}, i::Interval{T}) where T
throw(DomainError(i, "The interval is not closed with coinciding endpoints"))
end

function Base.convert(::Type{Interval{T,L,R}}, interval::Interval{N,L,R}) where {T,N,L,R}
return Interval{L,R}(convert(T, first(interval)), convert(T, last(interval)))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return Interval{L,R}(convert(T, first(interval)), convert(T, last(interval)))
return Interval{T,L,R}(first(interval), last(interval))

end

# Date/DateTime attempt to convert to Int64 instead of falling back to convert(T, ...)
Dates.Date(interval::Interval{Date}) = convert(Date, interval)
Dates.DateTime(interval::Interval{DateTime}) = convert(DateTime, interval)
Expand Down
3 changes: 3 additions & 0 deletions test/interval.jl
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ isinf(::TimeType) = false
@test_throws DomainError convert(Int, Interval{Closed, Open}(10, 10))
@test convert(Int, Interval{Closed, Closed}(10, 10)) == 10
@test_throws DomainError convert(Int, Interval{Closed, Closed}(10, 11))
@test convert(Interval{Float64, Closed, Closed}, Interval(1,2)) == Interval{Float64, Closed, Closed}(1.0,2.0)
Copy link
Collaborator

@omus omus Jul 14, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, convert(Interval{Float64, Open, Open}, Interval(1,2)) isn't lossless conversion. This means that the convert method should probably be defined as: Base.convert(::Type{Interval{T}}, interval::Interval{S,L,R}) where {T,S,L,R}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it also be useful to include Base.convert(::Type{Interval{T,L,R}}, interval::Interval{S}) where {T,S,L,R} such that if you need to convert from Closed Closed to e.g. Open Open you can? Should this type of conversion include Closed -> Open but not Open -> Closed

Copy link
Collaborator

@omus omus Jul 17, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this would make more sense as a constructor: https://docs.julialang.org/en/v1/manual/conversion-and-promotion/#Conversion-vs.-Construction-1.

I'd probably leave this out unless you have a use case.


for T in (Date, DateTime)
dt = T(2013, 2, 13)
Expand All @@ -94,6 +95,8 @@ isinf(::TimeType) = false
@test span(interval) == b - a
@test isclosed(interval) == (L === Closed && R === Closed)
@test isopen(interval) == (L === Open && R === Open)
@test containsfirst(interval) == (L === Closed)
@test containslast(interval) == (R === Closed)
end
end

Expand Down