(.require [lux (.except) ["_" test (.only Test)] [abstract [monad (.only do)]] [control ["[0]" io (.only IO)] ["[0]" try]] [math ["r" random]] [tool [compiler ["[0]" analysis] ["[0]" declaration] [phase [macro (.only Expander)] [generation (.only Bundle)]] [default [platform (.only Platform)]]]]] ["[0]" / ["[1][0]" common (.only Runner Definer)] ["[1]./" analysis ["[1][0]" type]] ["[1]./" generation ["[1][0]" primitive] ["[1][0]" structure] ["[1][0]" reference] ["[1][0]" case] ["[1][0]" function] ["[1][0]" common]]]) (def (test runner definer state expander) (-> Runner Definer analysis.State+ Expander Test) (all _.and (/analysis/type.spec expander state) (/generation/primitive.spec runner) (/generation/structure.spec runner) (/generation/reference.spec runner definer) (/generation/case.spec runner) (/generation/function.spec runner) (/generation/common.spec runner) )) (def .public (spec platform bundle expander program) (All (_ anchor expression declaration) (-> (IO (Platform IO anchor expression declaration)) (Bundle anchor expression declaration) Expander (-> expression declaration) Test)) (do r.monad [_ (in []) .let [?state,runner,definer (<| io.run! (do io.monad [platform platform]) (/common.executors platform bundle expander program))]] (case ?state,runner,definer {try.#Success [[declaration_bundle declaration_state] runner definer]} (..test runner definer (the [declaration.#analysis declaration.#state] declaration_state) expander) {try.#Failure error} (_.failure error))))