Skip to content

Commit 658acc2

Browse files
authored
Makie extension (#12)
1 parent ba82223 commit 658acc2

File tree

3 files changed

+68
-13
lines changed

3 files changed

+68
-13
lines changed

Project.toml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
11
name = "UnixTimes"
22
uuid = "ab1a18e7-b408-4913-896c-624bb82ed7f4"
33
authors = ["Christian Rorvik <[email protected]>"]
4-
version = "1.5.0"
4+
version = "1.6.0"
55

66
[deps]
77
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
88

9+
[weakdeps]
10+
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
11+
Observables = "510215fc-4207-5dde-b226-833fc4488ee2"
12+
TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53"
13+
14+
[extensions]
15+
UnixTimesMakieExt = ["Makie", "Observables"]
16+
UnixTimesTimeZonesExt = "TimeZones"
17+
918
[compat]
19+
Makie = "0.22"
20+
Observables = "0.5"
1021
TimeZones = "1"
1122
julia = "1.9"
1223

@@ -16,9 +27,3 @@ TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53"
1627

1728
[targets]
1829
test = ["Test", "TimeZones"]
19-
20-
[weakdeps]
21-
TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53"
22-
23-
[extensions]
24-
UnixTimesTimeZonesExt = "TimeZones"

ext/UnixTimesMakieExt.jl

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
module UnixTimesMakieExt
2+
3+
using UnixTimes
4+
using Makie
5+
using Observables
6+
using Dates
7+
8+
struct UnixTimeConversion <: Makie.AbstractDimConversion
9+
custom_epoch::Observable{Union{Nothing, UnixTime}}
10+
function UnixTimeConversion(custom_epoch = nothing)
11+
new(Observable{Union{Nothing, UnixTime}}(custom_epoch; ignore_equal_values=true))
12+
end
13+
end
14+
15+
function number_to_unixtime(conversion::UnixTimeConversion, i)
16+
Nanosecond(round(Int64, Float64(i))) + something(conversion.custom_epoch[], UNIX_EPOCH)
17+
end
18+
19+
Makie.needs_tick_update_observable(conversion::UnixTimeConversion) = nothing
20+
21+
Makie.MakieCore.should_dim_convert(::Type{UnixTime}) = true
22+
23+
Makie.create_dim_conversion(::Type{UnixTime}) = UnixTimeConversion()
24+
25+
function Makie.convert_dim_value(conversion::UnixTimeConversion, value::UnixTime)
26+
Dates.value(value - something(conversion.custom_epoch[], UNIX_EPOCH))
27+
end
28+
function Makie.convert_dim_value(conversion::UnixTimeConversion, values::AbstractArray{UnixTime})
29+
Dates.value.(values .- something(conversion.custom_epoch[], UNIX_EPOCH))
30+
end
31+
32+
function Makie.convert_dim_observable(conversion::UnixTimeConversion, values::Observable, deregister)
33+
if conversion.custom_epoch[] === nothing
34+
conversion.custom_epoch[] = last(values[])
35+
end
36+
37+
result = map(values, conversion.custom_epoch) do vs, ep
38+
Dates.value.(vs .- something(ep, UNIX_EPOCH))
39+
end
40+
append!(deregister, result.inputs)
41+
result
42+
end
43+
44+
function Makie.get_ticks(conversion::UnixTimeConversion, ticks, scale, formatter, vmin, vmax)
45+
tickvalues = Makie.get_tickvalues(formatter, scale, vmin, vmax)
46+
dates = number_to_unixtime.(Ref(conversion), tickvalues)
47+
tickvalues, string.(dates)
48+
end
49+
50+
end

src/UnixTimes.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,7 @@ Dates.Time(x::UnixTime) = Time(Nanosecond(Dates.value(x)))
5454

5555
Base.convert(::Type{DateTime}, x::UnixTime) = DateTime(x)
5656

57-
function UnixTime(x::DateTime)
58-
instant_ns = (Dates.value(x) - Dates.UNIXEPOCH) * 1_000_000
59-
UnixTime(Dates.UTInstant(Nanosecond(instant_ns)))
60-
end
57+
UnixTime(x::Dates.TimeType) = convert(UnixTime, x)
6158

6259
UnixTime(x::Date) = UnixTime(DateTime(x))
6360
UnixTime(x::Date, y::Time) =
@@ -76,7 +73,10 @@ function UnixTime(s::AbstractString)
7673
end
7774
end
7875

79-
Base.convert(::Type{UnixTime}, x::DateTime) = UnixTime(x)
76+
function Base.convert(::Type{UnixTime}, x::DateTime)
77+
instant_ns = (Dates.value(x) - Dates.UNIXEPOCH) * 1_000_000
78+
UnixTime(Dates.UTInstant(Nanosecond(instant_ns)))
79+
end
8080

8181
function Base.show(io::IO, x::UnixTime)
8282
xdt = convert(DateTime, x)
@@ -94,7 +94,7 @@ function Base.floor(x::UnixTime, p::Union{DatePeriod, TimePeriod})
9494
convert(UnixTime, floor(convert(DateTime, x), p))
9595
end
9696

97-
Dates.guess(a::UnixTime, b::UnixTime, c) = Dates.guess(DateTime(a), DateTime(b), c)
97+
Dates.guess(a::UnixTime, b::UnixTime, c) = (Dates.value(b) - Dates.value(a)) ÷ Dates.tons(c)
9898

9999
Dates.default_format(::Type{UnixTime}) = nothing
100100
Dates.format(x::UnixTime, fmt::Nothing) = string(x)

0 commit comments

Comments
 (0)