From a621ef95f4728d15bdf0b1828ac7dd6ac5af2795 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Thu, 18 Aug 2016 21:09:27 -0700 Subject: 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. --- 088file.mu | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to '088file.mu') 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 ] -- cgit 1.4.1-2-gfad0