(;module: lux (lux (control monad pipe) (data text/format [product]) [meta #+ Monad] (meta [type] (type ["tc" check]))) (luxc ["&" base] (lang analysis))) (def: #export (with-unknown-type action) (All [a] (-> (Meta Analysis) (Meta [Type Analysis]))) (do Monad [[var-id var-type] (&;with-type-env tc;create) analysis (&;with-expected-type var-type action) analysis-type (&;with-type-env (tc;clean var-id var-type)) _ (&;with-type-env (tc;delete var-id))] (wrap [analysis-type analysis]))) (def: #export (with-var body) (All [a] (-> (-> [Nat Type] (Meta a)) (Meta a))) (do Monad [[id var] (&;with-type-env tc;create) output (body [id var]) _ (&;with-type-env (tc;delete id))] (wrap output))) (def: #export (variant-out-of-bounds-error type size tag) (All [a] (-> Type Nat Nat (Meta a))) (&;fail (format "Trying to create variant with tag beyond type's limitations." "\n" " Tag: " (%i (nat-to-int tag)) "\n" "Size: " (%i (nat-to-int size)) "\n" "Type: " (%type type))))