aboutsummaryrefslogtreecommitdiff
path: root/data/writer.scm
diff options
context:
space:
mode:
Diffstat (limited to 'data/writer.scm')
-rw-r--r--data/writer.scm28
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))))