/src/async.lisp
http://github.com/mtravers/wuwei · Lisp · 55 lines · 18 code · 9 blank · 28 comment · 0 complexity · c1939389f77da039c000d255e84909ab MD5 · raw file
- (in-package :wu)
- ;;; +=========================================================================+
- ;;; | Copyright (c) 2009, 2010 Mike Travers and CollabRx, Inc |
- ;;; | |
- ;;; | Released under the MIT Open Source License |
- ;;; | http://www.opensource.org/licenses/mit-license.php |
- ;;; | |
- ;;; | Permission is hereby granted, free of charge, to any person obtaining |
- ;;; | a copy of this software and associated documentation files (the |
- ;;; | "Software"), to deal in the Software without restriction, including |
- ;;; | without limitation the rights to use, copy, modify, merge, publish, |
- ;;; | distribute, sublicense, and/or sell copies of the Software, and to |
- ;;; | permit persons to whom the Software is furnished to do so, subject to |
- ;;; | the following conditions: |
- ;;; | |
- ;;; | The above copyright notice and this permission notice shall be included |
- ;;; | in all copies or substantial portions of the Software. |
- ;;; | |
- ;;; | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
- ;;; | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
- ;;; | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
- ;;; | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
- ;;; | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
- ;;; | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
- ;;; | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
- ;;; +=========================================================================+
- ;;; Author: Mike Travers
- (export '(async))
- ;;; Render a DIV with PRE-TEXT now, and replace it with the results of BODY when that completes.
- ;;; Note that the use of continuations replaces a ton of special-purpose machinery.
- (defmacro async ((&key (pre-text "waiting...") spinner) &body body)
- `(let ((%id (gensym "async")))
- (html
- ((:div :id %id)
- (:princ ,pre-text)
- (when ,spinner
- (html (image-tag "spinner.gif"))))
- ((:script :type "text/javascript")
- (:princ
- (remote-function
- (ajax-continuation ()
- (render-update
- (:update
- %id
- ,@body)))
- :in-function? nil))))))