aboutsummaryrefslogtreecommitdiff
path: root/data/writer.scm
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@hornquist.se>2018-11-10 17:09:57 +0100
committerHugo Hörnquist <hugo@hornquist.se>2018-11-10 17:09:57 +0100
commitd6377ddd8f4a88cd07fdd927f78d7e5a90c13f5d (patch)
treee271c3c9e07c75eac76da0e8ae9767407d967a5b /data/writer.scm
parentFurther work. (diff)
downloadscheme-monad-d6377ddd8f4a88cd07fdd927f78d7e5a90c13f5d.tar.gz
scheme-monad-d6377ddd8f4a88cd07fdd927f78d7e5a90c13f5d.tar.xz
Move stuff into modules.
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))))