(.module: [lux #* [type (#+ :share)] [abstract ["." monad (#+ Monad do)]] [control ["." try (#+ Try)] [security ["!" capability]]] [data [binary (#+ Binary)] [text ["%" format (#+ format)] ["." encoding]] [collection ["." row] ["." list ("#@." functor)]]] [world ["." file (#+ File Directory)]]] [program [compositor ["." static (#+ Static)]]] ["." // (#+ Packager) [// ["." archive ["." descriptor] ["." artifact]] [cache ["." dependency]] ["." io #_ ["#" archive]] [// [language ["$" lux [generation (#+ Context)]]]]]]) ## TODO: Delete ASAP (type: (Action ! a) (! (Try a))) (def: (write-artifact monad file-system static context) (All [!] (-> (Monad !) (file.System !) Static Context (Action ! Binary))) (do (try.with monad) [artifact (let [[module artifact] context] (!.use (:: file-system file) [(io.artifact file-system static module (%.nat artifact))]))] (!.use (:: artifact content) []))) (def: (write-module monad file-system static sequence [module artifacts] so-far) (All [! directive] (-> (Monad !) (file.System !) Static (-> directive directive directive) [archive.ID (List artifact.ID)] directive (Action ! directive))) (monad.fold (:assume (try.with monad)) (function (_ artifact so-far) (do (try.with monad) [content (..write-artifact monad file-system static [module artifact]) content (:: monad wrap (encoding.from-utf8 content))] (wrap (sequence so-far (:share [directive] {directive so-far} {directive (:assume content)}))))) so-far artifacts)) (def: #export (package header to-code sequence) (All [! directive] (-> directive (-> directive Text) (-> directive directive directive) (Packager !))) (function (package monad file-system static archive program) (do {@ (try.with monad)} [cache (!.use (:: file-system directory) [(get@ #static.target static)]) order (:: monad wrap (dependency.load-order $.key archive))] (|> order (list@map (function (_ [module [module-id [descriptor document]]]) [module-id (|> descriptor (get@ #descriptor.registry) artifact.artifacts row.to-list (list@map (|>> (get@ #artifact.id))))])) (monad.fold @ (..write-module monad file-system static sequence) header) (:: @ map (|>> to-code encoding.to-utf8))))))