summary refs log tree commit diff
path: root/guix/monads.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/monads.scm')
-rw-r--r--guix/monads.scm14
1 files changed, 14 insertions, 0 deletions
diff --git a/guix/monads.scm b/guix/monads.scm
index 2ab3fb94f0..d9580a7f8e 100644
--- a/guix/monads.scm
+++ b/guix/monads.scm
@@ -38,6 +38,7 @@
             with-monad
             mlet
             mlet*
+            mbegin
             lift1 lift2 lift3 lift4 lift5 lift6 lift7 lift
             listm
             foldm
@@ -171,6 +172,19 @@ form is (VAR -> VAL), bind VAR to the non-monadic value VAL in the same way as
              (let ((var temp) ...)
                body ...)))))))
 
+(define-syntax mbegin
+  (syntax-rules ()
+    "Bind the given monadic expressions in sequence, returning the result of
+the last one."
+    ((_ monad mexp)
+     (with-monad monad
+       mexp))
+    ((_ monad mexp rest ...)
+     (with-monad monad
+       (>>= mexp
+            (lambda (unused-value)
+              (mbegin monad rest ...)))))))
+
 (define-syntax define-lift
   (syntax-rules ()
     ((_ liftn (args ...))