(.module: [lux #* [host (#+ 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]]]) (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 uri) (-> (Program Promise) (file.System Promise) URI (Promise (Try (File Promise)))) (do {! promise.monad} [home (\ program home []) #let [/ (\ system separator) absolute_path (format home / (..root /) / (..path / uri))]] (do {! (try.with !)} [_ (: (Promise (Try Path)) (file.make_directories promise.monad system (file.parent 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 uri)] (!.use (\ file content) []))) (def: (upload uri content) (do {! (try.with promise.monad)} [file (..file program system uri)] (!.use (\ file over_write) [content]))))