(define-module (data writer) #:use-module (oop goops) #:use-module (ice-9 match) #:use-module (data monoid) #:use-module (control monad) #:export (writer return-writer)) (read-enable 'curly-infix) (define-class () (value #:init-keyword #:value) (monoid #:init-keyword #:monoid)) (define (writer value context) (make #:value value #:monoid context)) (define-method (>>= (this ) (proc )) (match this (($ value monoid) (match (proc value) (($ nval ncontext) (writer nval { monoid <> ncontext })))))) (define-method (>> (a ) (b )) (match a (($ _ monoid-a) (match b (($ val monoid-b) (writer val (<> monoid-a monoid-b)) ))))) (define (return-writer val) (writer val "")) (define-method (write (this ) port) (match this (($ value monoid) (format port "[Writer ~s, ~s]" value monoid))))