diff options
Diffstat (limited to 'data/writer.scm')
-rw-r--r-- | data/writer.scm | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/data/writer.scm b/data/writer.scm new file mode 100644 index 0000000..b79c670 --- /dev/null +++ b/data/writer.scm @@ -0,0 +1,28 @@ +(define-module (data writer) + #:use-module (oop goops) + #:use-module (ice-9 match) + #:use-module (data monoid) + #:use-module (control monad) + #:export (writer)) + +(read-enable 'curly-infix) + +(define-class <writer> () + (value #:init-keyword #:value) + (monoid #:init-keyword #:monoid)) + +(define (writer value context) + (make <writer> + #:value value + #:monoid context)) + +(define-method (>>= (this <writer>) + (proc <procedure>)) + (match this (($ <writer> value monoid) + (match (proc value) + (($ <writer> nval ncontext) + (writer nval { monoid <> ", " <> ncontext })))))) + +(define-method (write (this <writer>) port) + (match this (($ <writer> value monoid) + (format port "[Writer ~s, ~s]" value monoid)))) |