emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 76269e7 1/3: Add `async-let' macro


From: Thierry Volpiatto
Subject: [elpa] master 76269e7 1/3: Add `async-let' macro
Date: Tue, 1 Nov 2016 07:29:17 +0000 (UTC)

branch: master
commit 76269e7db8c9c3acb8349c7a61ca11c68d368d0f
Author: John Wiegley <address@hidden>
Commit: Thierry Volpiatto <address@hidden>

    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

[Prev in Thread] Current Thread [Next in Thread]