diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-08-18 21:09:27 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-08-18 21:09:27 -0700 |
commit | a621ef95f4728d15bdf0b1828ac7dd6ac5af2795 (patch) | |
tree | 55e215014e53dfd5327dbd6eefb8d072b5b08a08 /088file.mu | |
parent | 47219d0b2b41096547a02b506d7413fe9a3d308a (diff) | |
download | mu-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.mu | 27 |
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 ] |