[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