diff options
Diffstat (limited to 'stdlib/source/lux/time/duration.lux')
-rw-r--r-- | stdlib/source/lux/time/duration.lux | 56 |
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)) |