(;module: lux (lux (control monad) [macro #+ Monad] (type ["TC" check])) (luxc ["&" base] (lang ["la" analysis #+ Analysis]))) ## [Analysers] (def: #export (analyse-check analyse eval type value) (-> &;Analyser &;Eval Code Code (Lux Analysis)) (do Monad [actual (eval Type type) #let [actual (:! Type actual)] expected macro;expected-type _ (&;within-type-env (TC;check expected actual))] (&;with-expected-type actual (analyse value)))) (def: #export (analyse-coerce analyse eval type value) (-> &;Analyser &;Eval Code Code (Lux Analysis)) (do Monad [actual (eval Type type) expected macro;expected-type _ (&;within-type-env (TC;check expected (:! Type actual)))] (&;with-expected-type Top (analyse value))))