diff options
-rw-r--r-- | stdlib/source/lux/control/exception.lux | 14 | ||||
-rw-r--r-- | stdlib/source/lux/time/duration.lux | 57 | ||||
-rw-r--r-- | stdlib/source/lux/tool/compiler/phase/macro.lux | 15 |
3 files changed, 48 insertions, 38 deletions
diff --git a/stdlib/source/lux/control/exception.lux b/stdlib/source/lux/control/exception.lux index cc8635b13..72cba8e54 100644 --- a/stdlib/source/lux/control/exception.lux +++ b/stdlib/source/lux/control/exception.lux @@ -1,6 +1,9 @@ (.module: {#.doc "Exception-handling functionality built on top of the Error type."} [lux #* [abstract + [monoid (#+)] + [fold (#+)] + [functor (#+)] [monad (#+ do)]] [control ["p" parser]] @@ -9,6 +12,8 @@ ["." maybe] ["." product] ["." text ("#@." monoid)] + [number + ["." nat ("#@." decimal)]] [collection ["." list ("#@." functor fold)]]] ["." macro @@ -163,3 +168,12 @@ success success)) + +(def: #export (enumerate %entry) + (All [a] + (-> (-> a Text) + (-> (List a) Text))) + (|>> list.enumerate + (list@map (function (_ [index entry]) + ($_ text@compose (nat@encode index) ": " (%entry entry)))) + (text.join-with text.new-line))) diff --git a/stdlib/source/lux/time/duration.lux b/stdlib/source/lux/time/duration.lux index 887a074f7..2ec2de13d 100644 --- a/stdlib/source/lux/time/duration.lux +++ b/stdlib/source/lux/time/duration.lux @@ -10,9 +10,9 @@ ["p" parser]] [data [number - ["." nat ("#;." decimal)] - ["." int ("#;." decimal number)]] - ["." text ("#;." monoid) + ["." nat ("#@." decimal)] + ["." int ("#@." decimal number)]] + ["." text ("#@." monoid) ["l" lexer]] ["e" error]] [type @@ -76,7 +76,7 @@ [>= i/>=] )))) - (open: "duration;." ..order) + (open: "duration@." ..order) (template [<name> <op>] [(def: #export (<name> left right) @@ -85,8 +85,8 @@ right left))] - [max duration;>] - [min duration;<] + [max duration@>] + [min duration@<] ) (template [<name> <op>] @@ -120,27 +120,26 @@ (def: identity ..empty) (def: compose ..merge)) -(def: #export (encode duration) - (-> Duration Text) - (if (:: ..equivalence = empty duration) - "+0ms" - (let [signed? (negative? duration) - [days time-left] [(query day duration) (frame day duration)] - days (if signed? - (int;abs days) - days) - time-left (if signed? - (..inverse time-left) - time-left) - [hours time-left] [(query hour time-left) (frame hour time-left)] - [minutes time-left] [(query minute time-left) (frame minute time-left)] - [seconds time-left] [(query second time-left) (frame second time-left)] - millis (to-millis time-left)] - ($_ text;compose - (if signed? "-" "+") - (if (i/= +0 days) "" (text;compose (nat;encode (.nat days)) "D")) - (if (i/= +0 hours) "" (text;compose (nat;encode (.nat hours)) "h")) - (if (i/= +0 minutes) "" (text;compose (nat;encode (.nat minutes)) "m")) - (if (i/= +0 seconds) "" (text;compose (nat;encode (.nat seconds)) "s")) - (if (i/= +0 millis) "" (text;compose (nat;encode (.nat millis)) "ms")) +(def: #export (encode duration) + (if (:: ..equivalence = empty duration) + "+0ms" + (let [signed? (negative? duration) + [days time-left] [(query day duration) (frame day duration)] + days (if signed? + (int@abs days) + days) + time-left (if signed? + (..inverse time-left) + time-left) + [hours time-left] [(query hour time-left) (frame hour time-left)] + [minutes time-left] [(query minute time-left) (frame minute time-left)] + [seconds time-left] [(query second time-left) (frame second time-left)] + millis (to-millis time-left)] + ($_ text@compose + (if signed? "-" "+") + (if (i/= +0 days) "" (text@compose (nat@encode (.nat days)) "D")) + (if (i/= +0 hours) "" (text@compose (nat@encode (.nat hours)) "h")) + (if (i/= +0 minutes) "" (text@compose (nat@encode (.nat minutes)) "m")) + (if (i/= +0 seconds) "" (text@compose (nat@encode (.nat seconds)) "s")) + (if (i/= +0 millis) "" (text@compose (nat@encode (.nat millis)) "ms")) )))) diff --git a/stdlib/source/lux/tool/compiler/phase/macro.lux b/stdlib/source/lux/tool/compiler/phase/macro.lux index ddbde68ad..9a94f9a4b 100644 --- a/stdlib/source/lux/tool/compiler/phase/macro.lux +++ b/stdlib/source/lux/tool/compiler/phase/macro.lux @@ -10,24 +10,21 @@ format] [collection [array (#+ Array)] - ["." list ("#;." functor)]]] + ["." list ("#@." functor)]]] ["." macro]] ["." //]) (exception: #export (expansion-failed {macro Name} {inputs (List Code)} {error Text}) (exception.report ["Macro" (%name macro)] - ["Inputs" (|> inputs - (list;map (|>> %code (format text.new-line text.tab))) - (text.join-with ""))] + ["Inputs" (exception.enumerate %code inputs)] ["Error" error])) -(exception: #export (must-have-single-expansion {macro Name} {inputs (List Code)}) +(exception: #export (must-have-single-expansion {macro Name} {inputs (List Code)} {outputs (List Code)}) (exception.report ["Macro" (%name macro)] - ["Inputs" (|> inputs - (list;map (|>> %code (format text.new-line text.tab))) - (text.join-with ""))])) + ["Inputs" (exception.enumerate %code inputs)] + ["Outputs" (exception.enumerate %code outputs)])) (type: #export Expander (-> Macro (List Code) Lux (Error (Error [Lux (List Code)])))) @@ -53,4 +50,4 @@ (wrap single) _ - (//.throw must-have-single-expansion [name inputs])))) + (//.throw must-have-single-expansion [name inputs expansion])))) |