(.module: [library [lux "*" ["_" test {"+" [Test]}] [abstract ["[0]" monad {"+" [do]}]] [control ["[0]" try {"+" [Try]}] [concurrency ["[0]" async {"+" [Async]}]]] [data [binary {"+" [Binary]}] ["[0]" product] ["[0]" text ("[1]\[0]" equivalence) ["%" format {"+" [format]}]] [collection ["[0]" list ("[1]\[0]" functor)] ["[0]" set]]] [math ["[0]" random {"+" [Random]}] [number ["n" nat]]] [world ["[0]" file {"+" [Path]}]]]] [// ["@[0]" version] [// ["@[0]" profile] [// [lux [data ["$[0]" binary]]]]]] [\\program ["[0]" / ["//[1]" /// "_" ["[1]" profile] ["[1][0]" action {"+" [Action]}]]]]) (def: node_name (Random Text) (random.ascii/alpha 10)) (def: (files prefix) (-> Path (Random (List [Path Binary]))) (do [! random.monad] [count (\ ! each (n.% 10) random.nat) names (random.set text.hash count ..node_name) contents (random.list count ($binary.random 100))] (in (list.zipped/2 (list\each (|>> (format prefix)) (set.list names)) contents)))) (def: (create_file! fs [path content]) (-> (file.System Async) [Path Binary] (Async (Try Any))) (\ fs write content path)) (def: (create_directory! fs path files) (-> (file.System Async) Path (List [Path Binary]) (Async (Try Any))) (do [! (try.with async.monad)] [_ (: (Async (Try Any)) (file.make_directories async.monad fs path)) _ (monad.each ! (..create_file! fs) files)] (in []))) (def: (directory_exists? fs) (-> (file.System Async) Path (Async (Try Bit))) (|>> (\ fs directory?) (try.lifted async.monad))) (def: (file_exists? fs) (-> (file.System Async) Path (Async (Try Bit))) (|>> (\ fs file?) (try.lifted async.monad))) (def: (assets_exist? fs directory_path files) (-> (file.System Async) Path (List [Path Binary]) (Async (Try Bit))) (do [! (try.with async.monad)] [directory_exists? (..directory_exists? fs directory_path) files_exist? (: (Action (List Bit)) (|> files (list\each product.left) (monad.each ///action.monad (..file_exists? fs))))] (in (and directory_exists? (list.every? (|>>) files_exist?))))) (def: .public test Test (<| (_.covering /._) (do [! random.monad] [context ..node_name target ..node_name sub ..node_name .let [fs (file.mock (\ file.default separator)) / (\ fs separator) target_path (format context / target) sub_path (format target_path / sub)] direct_files (..files (format target_path /)) sub_files (..files (format sub_path /)) dummy @profile.random] (in (do async.monad [.let [console (@version.echo "")] verdict (do [! (try.with async.monad)] [_ (..create_directory! fs target_path direct_files) _ (..create_directory! fs sub_path sub_files) context_exists!/pre (..directory_exists? fs context) target_exists!/pre (..assets_exist? fs target_path direct_files) sub_exists!/pre (..assets_exist? fs sub_path sub_files) _ (/.do! console fs (with@ #///.target target_path dummy)) context_exists!/post (..directory_exists? fs context) target_exists!/post (..assets_exist? fs target_path direct_files) sub_exists!/post (..assets_exist? fs sub_path sub_files) logging (\ console read_line [])] (in (and (and context_exists!/pre context_exists!/post) (and target_exists!/pre (not target_exists!/post)) (and sub_exists!/pre (not sub_exists!/post)) (text\= (/.success target_path) logging))))] (_.cover' [/.do! /.success] (try.else false verdict)))))))