(.module: [lux (#- Source) [abstract ["." monad (#+ do)]] [control ["." try (#+ Try)] [concurrency ["." promise (#+ Promise)]] [security ["!" capability]]] [data ["." text ["%" format (#+ format)]] [collection ["." dictionary] ["." row]] [format ["." binary] ["." tar]]] [time ["." instant]] [tool [compiler [meta ["." io #_ ["#" context (#+ Extension)]]]]] [world ["." file]]] [// [cli (#+ Source Export)]]) (def: file "library.tar") (def: no_ownership tar.Ownership (let [commons (: tar.Owner {#tar.name tar.anonymous #tar.id tar.no_id})] {#tar.user commons #tar.group commons})) (def: #export (library system sources) (-> (file.System Promise) (List Source) (Promise (Try tar.Tar))) (do (try.with promise.monad) [files (io.enumerate system sources)] (|> (dictionary.entries files) (monad.map try.monad (function (_ [path source_code]) (do try.monad [path (|> path (text.replace_all (\ system separator) .module_separator) tar.path) source_code (tar.content source_code)] (wrap (#tar.Normal [path (instant.from_millis +0) ($_ tar.and tar.read_by_owner tar.write_by_owner tar.read_by_group tar.write_by_group tar.read_by_other) ..no_ownership source_code]))))) (\ try.monad map row.from_list) (\ promise.monad wrap)))) (def: #export (export system [sources target]) (-> (file.System Promise) Export (Promise (Try Any))) (do (try.with promise.monad) [tar (..library system sources) package (: (Promise (Try (file.File Promise))) (file.get_file promise.monad system (format target (\ system separator) ..file)))] (|> tar (binary.run tar.writer) (!.use (\ package over_write)))))