(.module: [library [lux #* [abstract [monad (#+ Monad do)]] [control [pipe (#+ do>)] ["." try (#+ Try)] [parser ["<.>" code]]] [data [binary (#+ Binary)] ["." text [encoding ["." utf8]]]] [meta ["." location]] [tool [compiler [language [lux ["." syntax]]]]] [world ["." file]]]] ["." // #_ [profile (#+ Profile)] ["#." project (#+ Project)] ["#." parser]]) (def: (lux_parser source_code) (-> Text (Try Code)) (let [parse (syntax.parse "" syntax.no_aliases (text.size source_code))] (case (parse [location.dummy 0 source_code]) (#.Left [_ error]) (#try.Failure error) (#.Right [_ lux_code]) (#try.Success lux_code)))) (def: project_parser (-> Binary (Try Project)) (|>> (do> try.monad [(\ utf8.codec decoded)] [..lux_parser] [(list) (.result //parser.project)]))) (def: .public (read monad fs profile) (All [!] (-> (Monad !) (file.System !) Text (! (Try Profile)))) (|> //project.file (\ fs read) (\ monad map (|>> (do> try.monad [] [..project_parser] [(//project.profile profile)])))))