@@ -24,6 +24,8 @@ _type(::Type{Period{T, Tfactor, Texponent}}) where {T, Tfactor, Texponent} = T
2424_factor (:: Type{Period{T, Tfactor, Texponent}} ) where {T, Tfactor, Texponent} = unwrap (Tfactor)
2525_exponent (:: Type{Period{T, Tfactor, Texponent}} ) where {T, Tfactor, Texponent} = unwrap (Texponent)
2626
27+ Dates. value (p:: Period ) = p. duration
28+
2729function Base. zero (p:: Period{T, Tfactor, Texponent} ) where {T, Tfactor, Texponent}
2830 return Period {T, Tfactor, Texponent} (0 )
2931end
@@ -33,11 +35,11 @@ function Base.one(p::Period{T, Tfactor, Texponent}) where {T, Tfactor, Texponent
3335end
3436
3537function Base. abs (p:: Period{T, Tfactor, Texponent} ) where {T, Tfactor, Texponent}
36- return Period {T, Tfactor, Texponent} (abs (Dates . value (p)))
38+ return Period {T, Tfactor, Texponent} (abs (value (p)))
3739end
3840
39-
40- Dates . value (p :: Period ) = p . duration
41+ Base . sign (x :: Period ) = sign ( value (x))
42+ Base . signbit (x :: Period ) = signbit ( value (x))
4143
4244# helper functions for _timetuple
4345@inline __tf (result, time) = result
@@ -228,16 +230,21 @@ end
228230
229231# operations between two CFTime.Periods (or Dates.Period)
230232
231- # operators returning a CFTime.Period
232- for op in (:+ , :- , :mod )
233+ # operators returning a CFTime.Period
234+ for op in (:+ , :- , :mod , :lcm , :gcd , :rem )
233235 @eval begin
234236 function $op (p1:: Period{T, Tfactor, Texponent} , p2:: Period{T, Tfactor, Texponent} ) where {T, Tfactor, Texponent}
235237 return Period {T, Tfactor, Texponent} ($ op (p1. duration, p2. duration))
236238 end
237239 end
238240end
239241
240- # divisions and boolean functions
242+ function Base. gcdx (a:: T , b:: T ) where {T <: Period }
243+ (g, x, y) = gcdx (value (a), value (b))
244+ return (T (g), x, y)
245+ end
246+
247+ # operators not returning a CFTime.Period
241248for op in (:/ , :div , :(== ), :isless )
242249 @eval begin
243250 function $op (p1:: Period{T, Tfactor, Texponent} , p2:: Period{T, Tfactor, Texponent} ) where {T, Tfactor, Texponent}
@@ -247,7 +254,7 @@ for op in (:/, :div, :(==), :isless)
247254end
248255
249256
250- for op in (:+ , :- , :/ , :div , :mod , :(== ), :isless )
257+ for op in (:+ , :- , :/ , :div , :mod , :(== ), :isless , :lcm , :gcd , :gcdx , :rem )
251258 @eval begin
252259 $ op (p1:: Period , p2:: Period ) = $ op (promote (p1, p2)... )
253260 $ op (p1:: Period , p2:: Dates.Period ) = $ op (promote (p1, p2)... )
@@ -264,6 +271,7 @@ for op in (:*, :/, :div)
264271 end
265272 end
266273end
274+
267275* (v:: Number , p:: Period ) = p * v
268276
269277function - (p:: Period{T, Tfactor, Texponent} ) where {T, Tfactor, Texponent}
0 commit comments