Skip to content

Instantly share code, notes, and snippets.

@kalmarek
Last active March 21, 2021 10:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kalmarek/640630a53d5837a5c7fe401eb2f047bd to your computer and use it in GitHub Desktop.
Save kalmarek/640630a53d5837a5c7fe401eb2f047bd to your computer and use it in GitHub Desktop.
Order implementation
struct Order{I} <: Integer
val::I
Order{I}(n::Integer) where I<:Integer = (n > 0 ? new{I}(n) : throw(DomainError(0, "invalid order")))
Order{I}(::Val{Inf}) where I<:Integer = new{I}(0)
end
Order(n::I) where I<:Integer = Order{I}(n)
Order(v::Val{Inf}) = Order{Int}(v)
Base.isfinite(o::Order) = !iszero(o.val)
Base.promote_rule(::Type{<:Order}, ::Type{N}) where N<:Number = N
Base.convert(::Type{I}, o::Order) where I<:Number = isfinite(o) ? I(o.val) : throw(InexactError(:convert, I, o))
Base.convert(::Type{AF}, o::Order) where AF<:AbstractFloat = isfinite(o) ? AF(o.val) : AF(Inf)
Base.show(io::IO, o::Order) = isfinite(o) ? print(io, o.val) : print(io, "∞")
Base.:(-)(o::Order) = isfinite(o) ? -o.val : throw(DomainError(o, "Cannot negate infinite value"))
Base.:(==)(o::Order, r::Order) = o.val == r.val
function Base.:(<)(o::Order, r::R) where {R<:Real}
isfinite(o) && return o.val < r
isfinite(r) && return o < r.val
throw(ArgumentError("Infinite values are not comparable"))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment