about summary refs log tree commit diff stats
path: root/088file.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-08-18 21:09:27 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-08-18 21:09:27 -0700
commita621ef95f4728d15bdf0b1828ac7dd6ac5af2795 (patch)
tree55e215014e53dfd5327dbd6eefb8d072b5b08a08 /088file.mu
parent47219d0b2b41096547a02b506d7413fe9a3d308a (diff)
downloadmu-a621ef95f4728d15bdf0b1828ac7dd6ac5af2795.tar.gz
3225 - testable interface for writing files
For example usage of file operations, see filesystem.mu.

Is it ugly that we don't actually write to disk unless we wait for the
writing routine to exit? Maybe there's a nice way to wrap it. At any
rate, all buffering is explicit, which seems a win compared to *nix.
Diffstat (limited to '088file.mu')
-rw-r--r--088file.mu27
1 files changed, 24 insertions, 3 deletions
diff --git a/088file.mu b/088file.mu
index 6e6a89e1..b26ae438 100644
--- a/088file.mu
+++ b/088file.mu
@@ -8,12 +8,12 @@ container filesystem [
 def start-reading fs:address:filesystem, filename:address:array:character -> contents:address:source:character [
   local-scope
   load-ingredients
-  x:number/file <- $open-file-for-reading filename
+  file:number <- $open-file-for-reading filename
   contents:address:source:character, sink:address:sink:character <- new-channel 30
-  start-running transmit x, sink
+  start-running transmit-from-file file, sink
 ]
 
-def transmit file:number, sink:address:sink:character -> file:number, sink:address:sink:character [
+def transmit-from-file file:number, sink:address:sink:character -> file:number, sink:address:sink:character [
   local-scope
   load-ingredients
   {
@@ -23,4 +23,25 @@ def transmit file:number, sink:address:sink:character -> file:number, sink:addre
     loop
   }
   sink <- close sink
+  $close-file file
+]
+
+def start-writing fs:address:filesystem, filename:address:array:character -> sink:address:sink:character, routine-id:number [
+  local-scope
+  load-ingredients
+  file:number <- $open-file-for-writing filename
+  source:address:source:character, sink:address:sink:character <- new-channel 30
+  routine-id <- start-running transmit-to-file file, source
+]
+
+def transmit-to-file file:number, source:address:source:character -> file:number, source:address:source:character [
+  local-scope
+  load-ingredients
+  {
+    c:character, done?:boolean, source <- read source
+    break-if done?
+    $write-to-file file, c
+    loop
+  }
+  $close-file file
 ]