diff options
author | Eduardo Julian | 2017-08-22 20:32:34 -0400 |
---|---|---|
committer | Eduardo Julian | 2017-08-22 20:32:34 -0400 |
commit | d99484697f4d5bd78441ab001f487289b9cdc44e (patch) | |
tree | 75ea99ff15bfdd2851a64b34aacebd6921b661c4 /stdlib/source | |
parent | 9ba4a24f61dc545a7670374c05546375e4e6840d (diff) |
- Implemented a file-system library.
Diffstat (limited to 'stdlib/source')
-rw-r--r-- | stdlib/source/lux/world/fs.jvm.lux | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/stdlib/source/lux/world/fs.jvm.lux b/stdlib/source/lux/world/fs.jvm.lux new file mode 100644 index 000000000..665dfaea1 --- /dev/null +++ b/stdlib/source/lux/world/fs.jvm.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 #+ jvm-import])) + +(exception: Could-Not-Read-All-Data) + +(type: #export File Text) + +(jvm-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)) + +(jvm-import java.lang.AutoCloseable + (close [] #io #try void)) + +(jvm-import java.io.OutputStream + (write [Byte-Array] #io #try void) + (flush [] #io #try void)) + +(jvm-import java.io.FileOutputStream + (new [java.io.File boolean] #io #try)) + +(jvm-import java.io.InputStream + (read [Byte-Array] #io #try int)) + +(jvm-import java.io.FileInputStream + (new [java.io.File] #io #try)) + +(do-template [<name> <flag>] + [(def: #export (<name> data file) + (-> Blob File (T;Task Unit)) + (P;future (do (R;ResultT io;Monad<IO>) + [stream (FileOutputStream.new [(java.io.File.new file) <flag>]) + _ (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<IO>) + [#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<IO>) + [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<IO>) + [files (java.io.File.listFiles [] (java.io.File.new dir))] + (monad;map @ (java.io.File.getAbsolutePath []) + (array;to-list files))))) + +(do-template [<name> <method>] + [(def: #export (<name> file) + (-> File (T;Task Bool)) + (P;future (<method> [] (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<IO>) + [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)))) |