(.module: [lux #* [ffi (#+ import:)] [abstract [monad (#+ do)]] [control ["." try (#+ Try)] [concurrency ["." promise (#+ Promise)]] [security ["!" capability]]] [data ["." text ["%" format (#+ format)]]] [world [program (#+ Program)] ["." file (#+ Path File)] [net ["." uri (#+ URI)]]]] ["." // ["/#" // #_ ["#." local] ["#." metadata]]]) (def: (root /) (-> Text Path) (text.replace_all uri.separator / ///local.repository)) (def: path (-> Text URI Path) (text.replace_all uri.separator)) (def: (file program system create? uri) (-> (Program Promise) (file.System Promise) Bit URI (Promise (Try (File Promise)))) (do {! promise.monad} [#let [uri (text.replace_once ///metadata.remote_file ///metadata.local_file uri)] home (\ program home []) #let [/ (\ system separator) absolute_path (format home / (..root /) / (..path / uri))]] (if create? (do {! (try.with !)} [_ (: (Promise (Try Path)) (file.make_directories promise.monad system (file.parent system absolute_path)))] (: (Promise (Try (File Promise))) (file.get_file promise.monad system absolute_path))) (: (Promise (Try (File Promise))) (!.use (\ system file) absolute_path))))) (structure: #export (repository program system) (-> (Program Promise) (file.System Promise) (//.Repository Promise)) (def: (download uri) (do {! (try.with promise.monad)} [file (..file program system false uri)] (!.use (\ file content) []))) (def: (upload uri content) (do {! (try.with promise.monad)} [file (..file program system true uri)] (!.use (\ file over_write) [content]))))