aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/time/duration.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/lux/time/duration.lux')
-rw-r--r--stdlib/source/lux/time/duration.lux56
1 files changed, 31 insertions, 25 deletions
diff --git a/stdlib/source/lux/time/duration.lux b/stdlib/source/lux/time/duration.lux
index 0588d7ba2..1abac1cc0 100644
--- a/stdlib/source/lux/time/duration.lux
+++ b/stdlib/source/lux/time/duration.lux
@@ -63,21 +63,21 @@
(do-template [<name> <op>]
[(def: #export (<name> duration)
(-> Duration Bit)
- (<op> 0 (:representation duration)))]
+ (<op> +0 (:representation duration)))]
[positive? i/>]
[negative? i/<]
[neutral? i/=])
)
-(def: #export empty Duration (from-millis 0))
-(def: #export milli Duration (from-millis 1))
-(def: #export second Duration (scale 1_000 milli))
-(def: #export minute Duration (scale 60 second))
-(def: #export hour Duration (scale 60 minute))
-(def: #export day Duration (scale 24 hour))
-(def: #export week Duration (scale 7 day))
-(def: #export normal-year Duration (scale 365 day))
+(def: #export empty Duration (from-millis +0))
+(def: #export milli Duration (from-millis +1))
+(def: #export second Duration (scale +1_000 milli))
+(def: #export minute Duration (scale +60 second))
+(def: #export hour Duration (scale +60 minute))
+(def: #export day Duration (scale +24 hour))
+(def: #export week Duration (scale +7 day))
+(def: #export normal-year Duration (scale +365 day))
(def: #export leap-year Duration (merge day normal-year))
(structure: #export _ (Monoid Duration)
@@ -87,7 +87,7 @@
(def: (encode duration)
(-> Duration Text)
(if (:: Equivalence<Duration> = empty duration)
- "0ms"
+ "+0ms"
(let [signed? (negative? duration)
[days time-left] [(query day duration) (frame day duration)]
days (if signed?
@@ -102,38 +102,44 @@
millis (to-millis time-left)]
($_ text/compose
(if signed? "-" "")
- (if (i/= 0 days) "" (text/compose (int/encode days) "D"))
- (if (i/= 0 hours) "" (text/compose (int/encode hours) "h"))
- (if (i/= 0 minutes) "" (text/compose (int/encode minutes) "m"))
- (if (i/= 0 seconds) "" (text/compose (int/encode seconds) "s"))
- (if (i/= 0 millis) "" (text/compose (int/encode millis) "ms"))
+ (if (i/= +0 days) "" (text/compose (int/encode days) "D"))
+ (if (i/= +0 hours) "" (text/compose (int/encode hours) "h"))
+ (if (i/= +0 minutes) "" (text/compose (int/encode minutes) "m"))
+ (if (i/= +0 seconds) "" (text/compose (int/encode seconds) "s"))
+ (if (i/= +0 millis) "" (text/compose (int/encode millis) "ms"))
))))
(def: (lex-section suffix)
(-> Text (l.Lexer Int))
(|> (p.codec number.Codec<Text,Int> (l.many l.decimal))
(p.before (p.and (l.this suffix) (p.not l.alpha)))
- (p.default 0)))
+ (p.default +0)))
(def: lex-duration
(l.Lexer Duration)
(do p.Monad<Parser>
- [signed? (l.this? "-")
- #let [sign (function (_ raw) (if signed? (i/* -1 raw) raw))]
+ [signed? (p.or (l.this? "-") (l.this? "+"))
+ #let [sign (function (_ raw)
+ (case signed?
+ (#.Left _)
+ (i/* -1 raw)
+
+ (#.Right _)
+ raw))]
utc-day (lex-section "D")
utc-hour (lex-section "h")
utc-minute (lex-section "m")
_ (p.assert "Invalid minute."
- (and (i/>= 0 utc-minute)
- (i/<= 59 utc-minute)))
+ (and (i/>= +0 utc-minute)
+ (i/<= +59 utc-minute)))
utc-second (lex-section "s")
_ (p.assert "Invalid second."
- (and (i/>= 0 utc-second)
- (i/<= 59 utc-second)))
+ (and (i/>= +0 utc-second)
+ (i/<= +59 utc-second)))
utc-millis (lex-section "ms")
_ (p.assert "Invalid milli-seconds."
- (and (i/>= 0 utc-millis)
- (i/<= 999 utc-millis)))]
+ (and (i/>= +0 utc-millis)
+ (i/<= +999 utc-millis)))]
(wrap (|> empty
(merge (scale (sign utc-day) day))
(merge (scale (sign utc-hour) hour))
@@ -146,7 +152,7 @@
(l.run input lex-duration))
(structure: #export _
- {#.doc "For example: 15D21h14m51s827ms"}
+ {#.doc "For example: +15D21h14m51s827ms"}
(Codec Text Duration)
(def: encode encode)
(def: decode decode))