(.module: lux (lux (control monad ["ex" exception #+ exception:]) (data text/format [product]) [macro] (lang [type] (type ["tc" check]))) (luxc ["&" lang] (lang analysis))) (def: #export (with-unknown-type action) (All [a] (-> (Meta a) (Meta [Type a]))) (do macro.Monad [[_ varT] (&.with-type-env tc.var) analysis (&.with-type varT action) knownT (&.with-type-env (tc.clean varT))] (wrap [knownT analysis]))) (exception: #export Variant-Tag-Out-Of-Bounds) (def: #export (variant-out-of-bounds-error type size tag) (All [a] (-> Type Nat Nat (Meta a))) (&.throw Variant-Tag-Out-Of-Bounds (format " Tag: " (%n tag) "\n" "Variant Size: " (%n size) "\n" "Variant Type: " (%type type))))