(;module: lux (lux (control monad pipe) (data text/format [product]) [macro #+ Monad] [type] (type ["TC" check])) (luxc ["&" base] (lang analysis))) (def: #export (with-unknown-type action) (All [a] (-> (Lux Analysis) (Lux [Type Analysis]))) (do Monad [[var-id var-type] (&;within-type-env TC;create-var) analysis (&;with-expected-type var-type action) analysis-type (&;within-type-env (TC;clean var-id var-type)) _ (&;within-type-env (TC;delete-var var-id))] (wrap [analysis-type analysis]))) (def: #export (with-var body) (All [a] (-> (-> [Nat Type] (Lux a)) (Lux a))) (do Monad [[id var] (&;within-type-env TC;create-var) output (body [id var]) _ (&;within-type-env (TC;delete-var id))] (wrap output)))