(.module: [library [lux #* [abstract [monad (#+ do)]] [control ["." try] [concurrency ["." async (#+ Async)]]] [data ["." text ["%" format (#+ format)]]] [world [program (#+ Program)] ["." file] [net ["." uri (#+ URI)]]]]] ["." // ["/#" // #_ ["#." local] ["#." metadata]]]) (def: (root program /) (-> (Program Async) Text file.Path) (|> ///local.repository (text.replaced uri.separator /) (format (\ program home) /))) (def: (path /) (-> Text (-> URI file.Path)) (text.replaced uri.separator /)) (def: (absolute_path program /) (-> (Program Async) Text (-> URI file.Path)) (|>> ///metadata.local_uri (..path /) (format (..root program /) /))) (implementation: .public (repository program fs) (-> (Program Async) (file.System Async) (//.Repository Async)) (def: description (..root program (\ fs separator))) (def: download (|>> (..absolute_path program (\ fs separator)) (\ fs read))) (def: (upload uri content) (do {! async.monad} [.let [absolute_path (..absolute_path program (\ fs separator) uri)] ? (\ fs file? absolute_path) _ (if ? (in []) (case (file.parent fs absolute_path) (#.Some parent) (file.make_directories async.monad fs parent) _ (let [! (try.with async.monad)] (\ ! in []))))] (\ fs write content absolute_path))))