(define-module (monad either) #:use-module (oop goops) #:use-module (monad) #:export (left right) #:re-export (>>= >> return) ) (define-class () (slot #:init-keyword #:slot #:getter unwrap-either)) (define-class ()) (define-class ()) (define (left val) "Error values" (make #:slot val)) (define (right val) "Good values" (make #:slot val)) (define-method (write (this ) port) (format port "#<~a ~s>" (class-name (class-of this)) (unwrap-either this))) (define-method (>>= (this ) (_ )) this) (define-method (>>= (this ) (proc )) (proc (unwrap-either this))) (define-method (return (_ )) right)