167 lines
3.9 KiB
EmacsLisp
167 lines
3.9 KiB
EmacsLisp
|
;; deferred.el samples -*- lexical-binding: t; -*-
|
||
|
|
||
|
(require 'cl-lib)
|
||
|
(require 'deferred)
|
||
|
|
||
|
;;; Basic Chain
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:next
|
||
|
(lambda () (message "deferred start")))
|
||
|
(deferred:nextc it
|
||
|
(lambda ()
|
||
|
(message "chain 1")
|
||
|
1))
|
||
|
(deferred:nextc it
|
||
|
(lambda (x)
|
||
|
(message "chain 2 : %s" x)))
|
||
|
(deferred:nextc it
|
||
|
(lambda ()
|
||
|
(read-minibuffer "Input a number: ")))
|
||
|
(deferred:nextc it
|
||
|
(lambda (x)
|
||
|
(message "Got the number : %i" x)))
|
||
|
(deferred:error it
|
||
|
(lambda (err)
|
||
|
(message "Wrong input : %s" err))))
|
||
|
|
||
|
|
||
|
;;; Timer
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:wait 1000) ; 1000msec
|
||
|
(deferred:nextc it
|
||
|
(lambda (x)
|
||
|
(message "Timer sample! : %s msec" x))))
|
||
|
|
||
|
|
||
|
;;; Command process
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:process "ls" "-la")
|
||
|
(deferred:nextc it
|
||
|
(lambda (x) (insert x))))
|
||
|
|
||
|
|
||
|
;;; Web Access
|
||
|
|
||
|
;; Simple web access
|
||
|
|
||
|
(require 'url)
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:url-retrieve "http://www.gnu.org")
|
||
|
(deferred:nextc it
|
||
|
(lambda (buf)
|
||
|
(insert (with-current-buffer buf (buffer-string)))
|
||
|
(kill-buffer buf))))
|
||
|
|
||
|
;; Get an image
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:url-retrieve "http://www.google.co.jp/intl/en_com/images/srpr/logo1w.png")
|
||
|
(deferred:nextc it
|
||
|
(lambda (buf)
|
||
|
(insert-image
|
||
|
(create-image
|
||
|
(let ((data (with-current-buffer buf (buffer-string))))
|
||
|
(substring data (+ (string-match "\n\n" data) 2)))
|
||
|
'png t))
|
||
|
(kill-buffer buf))))
|
||
|
|
||
|
;; HTTP POST
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:url-post
|
||
|
"http://127.0.0.1:8080/post-test.cgi"
|
||
|
'(('a . "test") ('param . "OK")))
|
||
|
(deferred:nextc it
|
||
|
(lambda (buf)
|
||
|
(insert (with-current-buffer buf (buffer-string)))
|
||
|
(kill-buffer buf))))
|
||
|
|
||
|
|
||
|
;; Parallel deferred
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:parallel
|
||
|
(lambda ()
|
||
|
(deferred:url-retrieve "http://www.google.co.jp/intl/en_com/images/srpr/logo1w.png"))
|
||
|
(lambda ()
|
||
|
(deferred:url-retrieve "http://www.google.co.jp/images/srpr/nav_logo14.png")))
|
||
|
(deferred:nextc it
|
||
|
(lambda (buffers)
|
||
|
(cl-loop for i in buffers
|
||
|
do
|
||
|
(insert
|
||
|
(format
|
||
|
"size: %s\n"
|
||
|
(with-current-buffer i (length (buffer-string)))))
|
||
|
(kill-buffer i)))))
|
||
|
|
||
|
;; Get an image by wget and resize by ImageMagick
|
||
|
|
||
|
(deferred:$
|
||
|
|
||
|
;; try
|
||
|
(deferred:$
|
||
|
(deferred:process "wget" "-O" "a.jpg" "http://www.gnu.org/software/emacs/tour/images/splash.png")
|
||
|
(deferred:nextc it
|
||
|
(lambda () (deferred:process "convert" "a.jpg" "-resize" "100x100" "jpg:b.jpg")))
|
||
|
(deferred:nextc it
|
||
|
(lambda ()
|
||
|
(clear-image-cache)
|
||
|
(insert-image (create-image (expand-file-name "b.jpg") 'jpeg nil)))))
|
||
|
|
||
|
;; catch
|
||
|
(deferred:error it ;
|
||
|
(lambda (err)
|
||
|
(insert "Can not get a image! : " err)))
|
||
|
|
||
|
;; finally
|
||
|
(deferred:nextc it
|
||
|
(lambda ()
|
||
|
(deferred:parallel
|
||
|
(lambda () (delete-file "a.jpg"))
|
||
|
(lambda () (delete-file "b.jpg")))))
|
||
|
(deferred:nextc it
|
||
|
(lambda (x) (message ">> %s" x))))
|
||
|
|
||
|
|
||
|
;; Timeout Process
|
||
|
|
||
|
(deferred:$
|
||
|
(deferred:earlier
|
||
|
(deferred:process "sh" "-c" "sleep 3 | echo 'hello!'")
|
||
|
(deferred:$
|
||
|
(deferred:wait 1000) ; timeout msec
|
||
|
(deferred:nextc it (lambda () "canceled!"))))
|
||
|
(deferred:nextc it
|
||
|
(lambda (x) (insert x))))
|
||
|
|
||
|
|
||
|
;; Loop and animation
|
||
|
|
||
|
(let ((count 0) (anm "-/|\\-")
|
||
|
(end 50) (pos (point))
|
||
|
(wait-time 50))
|
||
|
(deferred:$
|
||
|
(deferred:next
|
||
|
(lambda (_) (message "Animation started.")))
|
||
|
|
||
|
(deferred:nextc it
|
||
|
(deferred:lambda (_)
|
||
|
(save-excursion
|
||
|
(when (< 0 count)
|
||
|
(goto-char pos) (delete-char 1))
|
||
|
(insert (char-to-string
|
||
|
(aref anm (% count (length anm))))))
|
||
|
(if (> end (cl-incf count))
|
||
|
(deferred:nextc (deferred:wait wait-time) self))))
|
||
|
|
||
|
(deferred:nextc it
|
||
|
(lambda (_)
|
||
|
(save-excursion
|
||
|
(goto-char pos) (delete-char 1))
|
||
|
(message "Animation finished.")))))
|