(.module: [lux (#- primitive) [control ["." monad (#+ do)] pipe] [data ["." maybe] ["." error] [collection ["." list ("#/." functor)] ["." dictionary (#+ Dictionary)]]]] ["." // (#+ Synthesis Phase) ["." function] ["." case] ["/." // ("#/." monad) ["." analysis (#+ Analysis)] ["." extension] [// ["." reference]]]]) (def: (primitive analysis) (-> analysis.Primitive //.Primitive) (case analysis #analysis.Unit (#//.Text //.unit) (^template [ ] ( value) ( value)) ([#analysis.Bit #//.Bit] [#analysis.Frac #//.F64] [#analysis.Text #//.Text]) (^template [ ] ( value) ( (.i64 value))) ([#analysis.Nat #//.I64] [#analysis.Int #//.I64] [#analysis.Rev #//.I64]))) (def: #export (phase analysis) Phase (case analysis (#analysis.Primitive analysis') (///wrap (#//.Primitive (..primitive analysis'))) (#analysis.Structure structure) (case structure (#analysis.Variant variant) (do ///.monad [valueS (phase (get@ #analysis.value variant))] (wrap (//.variant (set@ #analysis.value valueS variant)))) (#analysis.Tuple tuple) (|> tuple (monad.map ///.monad phase) (:: ///.monad map (|>> //.tuple)))) (#analysis.Reference reference) (///wrap (#//.Reference reference)) (#analysis.Case inputA branchesAB+) (case.synthesize phase inputA branchesAB+) (^ (analysis.no-op value)) (phase value) (#analysis.Apply _) (function.apply phase analysis) (#analysis.Function environmentA bodyA) (function.abstraction phase environmentA bodyA) (#analysis.Extension name args) (function (_ state) (|> (extension.apply "Synthesis" phase [name args]) (///.run' state) (case> (#error.Success output) (#error.Success output) (#error.Failure error) (<| (///.run' state) (do ///.monad [argsS+ (monad.map @ phase args)] (wrap (#//.Extension [name argsS+]))))))) ))