(;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))))