(.module: [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)]] [control ["." io (#+ IO)] ["." try]] [math ["r" random]] [tool [compiler ["." analysis] ["." directive] [phase [macro (#+ Expander)] [generation (#+ Bundle)]] [default [platform (#+ Platform)]]]]] ["." / #_ ["#." common (#+ Runner Definer)] ["#./" analysis #_ ["#." type]] ["#./" generation #_ ["#." primitive] ["#." structure] ["#." reference] ["#." case] ["#." function] ["#." common]]]) (def: (test runner definer state expander) (-> Runner Definer analysis.State+ Expander Test) ($_ _.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 directive] (-> (IO (Platform IO anchor expression directive)) (Bundle anchor expression directive) Expander (-> expression directive) 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 [[directive_bundle directive_state] runner definer]) (..test runner definer (value@ [#directive.analysis #directive.state] directive_state) expander) (#try.Failure error) (_.failure error))))