branch: master
commit 76269e7db8c9c3acb8349c7a61ca11c68d368d0f
Author: John Wiegley <jo...@newartisans.com>
Commit: Thierry Volpiatto <thierry.volpia...@gmail.com>

    Add `async-let' macro
---
 async.el |   28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/async.el b/async.el
index 3798c95..a280d3d 100644
--- a/async.el
+++ b/async.el
@@ -298,6 +298,34 @@ returns nil.  It can still be useful, however, as an 
argument to
   "Evaluate FUNC in a separate Emacs process, synchronously."
   `(async-get (async-start ,func)))
 
+(defun async--fold-left (f z xs)
+  (let ((res z))
+    (dolist (x xs)
+      (setq res (funcall f res x)))
+    res))
+
+(defmacro async-let (bindings forms)
+  "Implements `let', but each binding is established asynchronously.
+For example:
+
+  (async-let ((x (foo))
+              (y (bar)))
+     (message "%s %s" x y))
+
+    expands to ==>
+
+  (async-start (foo)
+   (lambda (x)
+     (async-start (bar)
+      (lambda (y)
+        (message "%s %s" x y)))))"
+  (async--fold-left
+   (lambda (acc binding)
+     `(async-start ,(cadr binding)
+                   (lambda (,(car binding))
+                     ,acc)))
+   forms (reverse bindings)))
+
 (provide 'async)
 
 ;;; async.el ends here

Reply via email to