From a2c29fe44720003df06f7f14d0bf02332298b87f Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Mon, 16 Oct 2017 18:30:18 -0400 Subject: - Re-named lux/world/fs to lux/world/file. --- stdlib/source/lux/world/file.lux | 120 ++++++++++++++++++++++++++ stdlib/source/lux/world/fs.jvm.lux | 120 -------------------------- stdlib/test/test/lux/world/file.lux | 162 ++++++++++++++++++++++++++++++++++++ stdlib/test/test/lux/world/fs.lux | 162 ------------------------------------ stdlib/test/tests.lux | 2 +- 5 files changed, 283 insertions(+), 283 deletions(-) create mode 100644 stdlib/source/lux/world/file.lux delete mode 100644 stdlib/source/lux/world/fs.jvm.lux create mode 100644 stdlib/test/test/lux/world/file.lux delete mode 100644 stdlib/test/test/lux/world/fs.lux (limited to 'stdlib') diff --git a/stdlib/source/lux/world/file.lux b/stdlib/source/lux/world/file.lux new file mode 100644 index 000000000..4c0881e04 --- /dev/null +++ b/stdlib/source/lux/world/file.lux @@ -0,0 +1,120 @@ +(;module: + lux + (lux (control [monad #+ do] + ["ex" exception #+ exception:]) + (concurrency ["P" promise] + ["T" task]) + (data ["R" result] + (coll [array])) + (time ["i" instant] + ["d" duration]) + (world [blob #+ Blob]) + [io] + [host])) + +(exception: Could-Not-Read-All-Data) + +(type: #export File Text) + +(host;import #long java.io.File + (new [String]) + (exists [] #io #try boolean) + (mkdir [] #io #try boolean) + (delete [] #io #try boolean) + (length [] #io #try long) + (listFiles [] #io #try (Array java.io.File)) + (getAbsolutePath [] #io #try String) + (renameTo [java.io.File] #io #try boolean) + (isFile [] #io #try boolean) + (isDirectory [] #io #try boolean) + (lastModified [] #io #try long) + (setLastModified [long] #io #try boolean) + (canRead [] #io #try boolean) + (canWrite [] #io #try boolean) + (canExecute [] #io #try boolean)) + +(host;import java.lang.AutoCloseable + (close [] #io #try void)) + +(host;import java.io.OutputStream + (write [(Array byte)] #io #try void) + (flush [] #io #try void)) + +(host;import java.io.FileOutputStream + (new [java.io.File boolean] #io #try)) + +(host;import java.io.InputStream + (read [(Array byte)] #io #try int)) + +(host;import java.io.FileInputStream + (new [java.io.File] #io #try)) + +(do-template [ ] + [(def: #export ( data file) + (-> Blob File (T;Task Unit)) + (P;future (do (R;ResultT io;Monad) + [stream (FileOutputStream.new [(java.io.File.new file) ]) + _ (OutputStream.write [data] stream) + _ (OutputStream.flush [] stream)] + (AutoCloseable.close [] stream))))] + + [append true] + [write false] + ) + +(def: #export (read file) + (-> File (T;Task Blob)) + (P;future (do (R;ResultT io;Monad) + [#let [file' (java.io.File.new file)] + size (java.io.File.length [] file') + #let [data (blob;create (int-to-nat size))] + stream (FileInputStream.new [file']) + bytes-read (InputStream.read [data] stream) + _ (AutoCloseable.close [] stream)] + (if (i.= size bytes-read) + (wrap data) + (io;io (ex;throw Could-Not-Read-All-Data file)))))) + +(def: #export (size file) + (-> File (T;Task Nat)) + (P;future (do (R;ResultT io;Monad) + [size (java.io.File.length [] (java.io.File.new file))] + (wrap (int-to-nat size))))) + +(def: #export (files dir) + (-> File (T;Task (List File))) + (P;future (do (R;ResultT io;Monad) + [files (java.io.File.listFiles [] (java.io.File.new dir))] + (monad;map @ (java.io.File.getAbsolutePath []) + (array;to-list files))))) + +(do-template [ ] + [(def: #export ( file) + (-> File (T;Task Bool)) + (P;future ( [] (java.io.File.new file))))] + + [exists? java.io.File.exists] + [make-dir java.io.File.mkdir] + [delete java.io.File.delete] + [file? java.io.File.isFile] + [directory? java.io.File.isDirectory] + [can-read? java.io.File.canRead] + [can-write? java.io.File.canWrite] + [can-execute? java.io.File.canExecute] + ) + +(def: #export (move target source) + (-> File File (T;Task Bool)) + (P;future (java.io.File.renameTo [(java.io.File.new target)] + (java.io.File.new source)))) + +(def: #export (get-last-modified file) + (-> File (T;Task i;Instant)) + (P;future (do (R;ResultT io;Monad) + [millis (java.io.File.lastModified [] (java.io.File.new file))] + (wrap (|> millis d;from-millis i;absolute))))) + +(def: #export (set-last-modified time file) + (-> i;Instant File (T;Task Bool)) + (P;future (java.io.File.setLastModified [(|> time i;relative d;to-millis)] + (java.io.File.new file)))) diff --git a/stdlib/source/lux/world/fs.jvm.lux b/stdlib/source/lux/world/fs.jvm.lux deleted file mode 100644 index 4c0881e04..000000000 --- a/stdlib/source/lux/world/fs.jvm.lux +++ /dev/null @@ -1,120 +0,0 @@ -(;module: - lux - (lux (control [monad #+ do] - ["ex" exception #+ exception:]) - (concurrency ["P" promise] - ["T" task]) - (data ["R" result] - (coll [array])) - (time ["i" instant] - ["d" duration]) - (world [blob #+ Blob]) - [io] - [host])) - -(exception: Could-Not-Read-All-Data) - -(type: #export File Text) - -(host;import #long java.io.File - (new [String]) - (exists [] #io #try boolean) - (mkdir [] #io #try boolean) - (delete [] #io #try boolean) - (length [] #io #try long) - (listFiles [] #io #try (Array java.io.File)) - (getAbsolutePath [] #io #try String) - (renameTo [java.io.File] #io #try boolean) - (isFile [] #io #try boolean) - (isDirectory [] #io #try boolean) - (lastModified [] #io #try long) - (setLastModified [long] #io #try boolean) - (canRead [] #io #try boolean) - (canWrite [] #io #try boolean) - (canExecute [] #io #try boolean)) - -(host;import java.lang.AutoCloseable - (close [] #io #try void)) - -(host;import java.io.OutputStream - (write [(Array byte)] #io #try void) - (flush [] #io #try void)) - -(host;import java.io.FileOutputStream - (new [java.io.File boolean] #io #try)) - -(host;import java.io.InputStream - (read [(Array byte)] #io #try int)) - -(host;import java.io.FileInputStream - (new [java.io.File] #io #try)) - -(do-template [ ] - [(def: #export ( data file) - (-> Blob File (T;Task Unit)) - (P;future (do (R;ResultT io;Monad) - [stream (FileOutputStream.new [(java.io.File.new file) ]) - _ (OutputStream.write [data] stream) - _ (OutputStream.flush [] stream)] - (AutoCloseable.close [] stream))))] - - [append true] - [write false] - ) - -(def: #export (read file) - (-> File (T;Task Blob)) - (P;future (do (R;ResultT io;Monad) - [#let [file' (java.io.File.new file)] - size (java.io.File.length [] file') - #let [data (blob;create (int-to-nat size))] - stream (FileInputStream.new [file']) - bytes-read (InputStream.read [data] stream) - _ (AutoCloseable.close [] stream)] - (if (i.= size bytes-read) - (wrap data) - (io;io (ex;throw Could-Not-Read-All-Data file)))))) - -(def: #export (size file) - (-> File (T;Task Nat)) - (P;future (do (R;ResultT io;Monad) - [size (java.io.File.length [] (java.io.File.new file))] - (wrap (int-to-nat size))))) - -(def: #export (files dir) - (-> File (T;Task (List File))) - (P;future (do (R;ResultT io;Monad) - [files (java.io.File.listFiles [] (java.io.File.new dir))] - (monad;map @ (java.io.File.getAbsolutePath []) - (array;to-list files))))) - -(do-template [ ] - [(def: #export ( file) - (-> File (T;Task Bool)) - (P;future ( [] (java.io.File.new file))))] - - [exists? java.io.File.exists] - [make-dir java.io.File.mkdir] - [delete java.io.File.delete] - [file? java.io.File.isFile] - [directory? java.io.File.isDirectory] - [can-read? java.io.File.canRead] - [can-write? java.io.File.canWrite] - [can-execute? java.io.File.canExecute] - ) - -(def: #export (move target source) - (-> File File (T;Task Bool)) - (P;future (java.io.File.renameTo [(java.io.File.new target)] - (java.io.File.new source)))) - -(def: #export (get-last-modified file) - (-> File (T;Task i;Instant)) - (P;future (do (R;ResultT io;Monad) - [millis (java.io.File.lastModified [] (java.io.File.new file))] - (wrap (|> millis d;from-millis i;absolute))))) - -(def: #export (set-last-modified time file) - (-> i;Instant File (T;Task Bool)) - (P;future (java.io.File.setLastModified [(|> time i;relative d;to-millis)] - (java.io.File.new file)))) diff --git a/stdlib/test/test/lux/world/file.lux b/stdlib/test/test/lux/world/file.lux new file mode 100644 index 000000000..3e653d0b1 --- /dev/null +++ b/stdlib/test/test/lux/world/file.lux @@ -0,0 +1,162 @@ +(;module: + lux + (lux [io] + (control [monad #+ do]) + (concurrency ["P" promise] + ["T" task]) + (data ["R" result] + [text] + text/format + [number]) + (time ["i" instant] + ["d" duration]) + (world ["@" file] + [blob]) + ["r" math/random]) + lux/test + (.. ["_;" blob])) + +(def: truncate-millis + (|>. (i./ 1_000) (i.* 1_000))) + +(context: "File system." + #times +1 + [file-size (|> r;nat (:: @ map (|>. (n.% +100) (n.max +10)))) + dataL (_blob;blob file-size) + dataR (_blob;blob file-size) + code r;nat + last-modified (|> r;int (:: @ map (|>. (:: number;Number abs) + truncate-millis + d;from-millis + i;absolute)))] + ($_ seq + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +0 code)))] + result (do T;Monad + [pre (@;exists? file) + _ (@;write dataL file) + post (@;exists? file) + deleted? (@;delete file) + remains? (@;exists? file)] + (wrap (and (not pre) post + deleted? (not remains?))))] + (test "Can create/delete files." + (R;default false result))) + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +1 code)))] + result (do T;Monad + [_ (@;write dataL file) + output (@;read file) + _ (@;delete file)] + (wrap (:: blob;Eq = dataL output)))] + (test "Can write/read files." + (R;default false result))) + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +2 code)))] + result (do T;Monad + [_ (@;write dataL file) + read-size (@;size file) + _ (@;delete file)] + (wrap (n.= file-size read-size)))] + (test "Can read file size." + (R;default false result))) + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +3 code)))] + result (do T;Monad + [_ (@;write dataL file) + _ (@;append dataR file) + output (@;read file) + read-size (@;size file) + _ (@;delete file)] + (wrap (and (n.= (n.* +2 file-size) read-size) + (:: blob;Eq = dataL (R;assume (blob;slice +0 (n.dec file-size) output))) + (:: blob;Eq = dataR (R;assume (blob;slice file-size (n.dec read-size) output))))))] + (test "Can append to files." + (R;default false result))) + (do P;Monad + [#let [dir (format "temp_dir_" (%n (n.+ +4 code)))] + result (do T;Monad + [pre (@;exists? dir) + _ (@;make-dir dir) + post (@;exists? dir) + deleted? (@;delete dir) + remains? (@;exists? dir)] + (wrap (and (not pre) post + deleted? (not remains?))))] + (test "Can create/delete directories." + (R;default false result))) + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +5 code))) + dir (format "temp_dir_" (%n (n.+ +5 code)))] + result (do T;Monad + [_ (@;write dataL file) + file-is-file (@;file? file) + file-is-directory (@;directory? file) + _ (@;delete file) + _ (@;make-dir dir) + directory-is-file (@;file? dir) + directory-is-directory (@;directory? dir) + _ (@;delete dir)] + (wrap (and file-is-file (not file-is-directory) + (not directory-is-file) directory-is-directory)))] + (test "Can differentiate files from directories." + (R;default false result))) + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +6 code))) + dir (format "temp_dir_" (%n (n.+ +6 code)))] + result (do T;Monad + [_ (@;make-dir dir) + #let [file' (format dir "/" file)] + _ (@;write dataL file') + read-size (@;size file') + deleted-file (@;delete file') + deleted-dir (@;delete dir)] + (wrap (and (n.= file-size read-size) + deleted-file + deleted-dir)))] + (test "Can create files inside of directories." + (R;default false result))) + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +7 code))) + dir (format "temp_dir_" (%n (n.+ +7 code)))] + result (do T;Monad + [_ (@;make-dir dir) + #let [file' (format dir "/" file)] + _ (@;write dataL file') + children (@;files dir) + _ (@;delete file') + _ (@;delete dir)] + (wrap (case children + (^ (list child)) + (text;ends-with? file' child) + + _ + false)))] + (test "Can list files inside a directory." + (R;default false result))) + (do P;Monad + [#let [file (format "temp_file_" (%n (n.+ +8 code)))] + result (do T;Monad + [_ (@;write dataL file) + was-modified? (@;set-last-modified last-modified file) + time-read (@;get-last-modified file) + _ (@;delete file)] + (wrap (and was-modified? + (:: i;Eq = last-modified time-read))))] + (test "Can change the time of last modification." + (R;default false result))) + (do P;Monad + [#let [file0 (format "temp_file_" (%n (n.+ +9 code)) "0") + file1 (format "temp_file_" (%n (n.+ +9 code)) "1")] + result (do T;Monad + [_ (@;write dataL file0) + pre (@;exists? file0) + moved? (@;move file1 file0) + post (@;exists? file0) + confirmed? (@;exists? file1) + deleted? (@;delete file1)] + (wrap (and pre moved? (not post) + confirmed? deleted?)))] + (test "Can move a file from one path to another." + (R;default false result))) + )) diff --git a/stdlib/test/test/lux/world/fs.lux b/stdlib/test/test/lux/world/fs.lux deleted file mode 100644 index 8289beac4..000000000 --- a/stdlib/test/test/lux/world/fs.lux +++ /dev/null @@ -1,162 +0,0 @@ -(;module: - lux - (lux [io] - (control [monad #+ do]) - (concurrency ["P" promise] - ["T" task]) - (data ["R" result] - [text] - text/format - [number]) - (time ["i" instant] - ["d" duration]) - (world ["@" fs] - [blob]) - ["r" math/random]) - lux/test - (.. ["_;" blob])) - -(def: truncate-millis - (|>. (i./ 1_000) (i.* 1_000))) - -(context: "File system." - #times +1 - [file-size (|> r;nat (:: @ map (|>. (n.% +100) (n.max +10)))) - dataL (_blob;blob file-size) - dataR (_blob;blob file-size) - code r;nat - last-modified (|> r;int (:: @ map (|>. (:: number;Number abs) - truncate-millis - d;from-millis - i;absolute)))] - ($_ seq - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +0 code)))] - result (do T;Monad - [pre (@;exists? file) - _ (@;write dataL file) - post (@;exists? file) - deleted? (@;delete file) - remains? (@;exists? file)] - (wrap (and (not pre) post - deleted? (not remains?))))] - (test "Can create/delete files." - (R;default false result))) - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +1 code)))] - result (do T;Monad - [_ (@;write dataL file) - output (@;read file) - _ (@;delete file)] - (wrap (:: blob;Eq = dataL output)))] - (test "Can write/read files." - (R;default false result))) - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +2 code)))] - result (do T;Monad - [_ (@;write dataL file) - read-size (@;size file) - _ (@;delete file)] - (wrap (n.= file-size read-size)))] - (test "Can read file size." - (R;default false result))) - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +3 code)))] - result (do T;Monad - [_ (@;write dataL file) - _ (@;append dataR file) - output (@;read file) - read-size (@;size file) - _ (@;delete file)] - (wrap (and (n.= (n.* +2 file-size) read-size) - (:: blob;Eq = dataL (R;assume (blob;slice +0 (n.dec file-size) output))) - (:: blob;Eq = dataR (R;assume (blob;slice file-size (n.dec read-size) output))))))] - (test "Can append to files." - (R;default false result))) - (do P;Monad - [#let [dir (format "temp_dir_" (%n (n.+ +4 code)))] - result (do T;Monad - [pre (@;exists? dir) - _ (@;make-dir dir) - post (@;exists? dir) - deleted? (@;delete dir) - remains? (@;exists? dir)] - (wrap (and (not pre) post - deleted? (not remains?))))] - (test "Can create/delete directories." - (R;default false result))) - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +5 code))) - dir (format "temp_dir_" (%n (n.+ +5 code)))] - result (do T;Monad - [_ (@;write dataL file) - file-is-file (@;file? file) - file-is-directory (@;directory? file) - _ (@;delete file) - _ (@;make-dir dir) - directory-is-file (@;file? dir) - directory-is-directory (@;directory? dir) - _ (@;delete dir)] - (wrap (and file-is-file (not file-is-directory) - (not directory-is-file) directory-is-directory)))] - (test "Can differentiate files from directories." - (R;default false result))) - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +6 code))) - dir (format "temp_dir_" (%n (n.+ +6 code)))] - result (do T;Monad - [_ (@;make-dir dir) - #let [file' (format dir "/" file)] - _ (@;write dataL file') - read-size (@;size file') - deleted-file (@;delete file') - deleted-dir (@;delete dir)] - (wrap (and (n.= file-size read-size) - deleted-file - deleted-dir)))] - (test "Can create files inside of directories." - (R;default false result))) - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +7 code))) - dir (format "temp_dir_" (%n (n.+ +7 code)))] - result (do T;Monad - [_ (@;make-dir dir) - #let [file' (format dir "/" file)] - _ (@;write dataL file') - children (@;files dir) - _ (@;delete file') - _ (@;delete dir)] - (wrap (case children - (^ (list child)) - (text;ends-with? file' child) - - _ - false)))] - (test "Can list files inside a directory." - (R;default false result))) - (do P;Monad - [#let [file (format "temp_file_" (%n (n.+ +8 code)))] - result (do T;Monad - [_ (@;write dataL file) - was-modified? (@;set-last-modified last-modified file) - time-read (@;get-last-modified file) - _ (@;delete file)] - (wrap (and was-modified? - (:: i;Eq = last-modified time-read))))] - (test "Can change the time of last modification." - (R;default false result))) - (do P;Monad - [#let [file0 (format "temp_file_" (%n (n.+ +9 code)) "0") - file1 (format "temp_file_" (%n (n.+ +9 code)) "1")] - result (do T;Monad - [_ (@;write dataL file0) - pre (@;exists? file0) - moved? (@;move file1 file0) - post (@;exists? file0) - confirmed? (@;exists? file1) - deleted? (@;delete file1)] - (wrap (and pre moved? (not post) - confirmed? deleted?)))] - (test "Can move a file from one path to another." - (R;default false result))) - )) diff --git a/stdlib/test/tests.lux b/stdlib/test/tests.lux index 62683aea5..e5cf4df6f 100644 --- a/stdlib/test/tests.lux +++ b/stdlib/test/tests.lux @@ -72,7 +72,7 @@ ["_;" auto] ["_;" object]) (world ["_;" blob] - ["_;" fs] + ["_;" file] (net ["_;" tcp] ["_;" udp])) )) -- cgit v1.2.3