(.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))))