aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source')
-rw-r--r--stdlib/source/lux/world/fs.jvm.lux120
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))))