Skip to content

Instantly share code, notes, and snippets.

@gongo
Last active December 12, 2015 07:18
Show Gist options
  • Save gongo/4735603 to your computer and use it in GitHub Desktop.
Save gongo/4735603 to your computer and use it in GitHub Desktop.
;; M-x package-install deferred
(require 'deferred)
;;
;; 制限時間内(LIMIT) に生成した乱数が THRESHOLD を越えれば "success!",
;; タイムアウトした場合は "timeout..." と表示されます。
;;
;; 乱数生成の間隔は INTERVAL です。
;;
(defun hogebuffering ()
(lexical-let ((timeout? nil)
(threshold 7)
(interval 1000))
(let ((limit 4000) ;; 4sec
(d (deferred:lambda (x)
(deferred:nextc (deferred:wait interval)
(lambda (x)
(message "%S" x)
(let ((n (random 11)))
(message "current number = %2d" n)
(cond ((> n threshold) t)
(timeout? nil)
(t (deferred:nextc (deferred:succeed) self)))))))))
(deferred:$
(deferred:timeout
limit nil
(deferred:next d))
(deferred:nextc it
(lambda (x)
(setq timeout? t)
x))))))
(deferred:nextc (hogebuffering)
(lambda (result)
(message "%s" (if result "success!" "timeout.."))))
;;
;; ↑ だけだと 乱数生成するところは deferred じゃなくて while でいいです。
;; というわけで airplay.el に合わせてみる。
;;
;;
;; 制限時間内(LIMIT) に動画がスタートした場合、"success!"
;; タイムアウトした場合は "timeout..." と表示されます。
;;
;; 動画がスタートしているかどうかの確認間隔は INTERVAL(sec) です。
;;
(defun airplay/video:--buffering? ()
(lexical-let ((timeout? nil)
(interval 1000))
(let ((limit 30000) ;; 30sec
(d (deferred:lambda (x)
(deferred:nextc (airplay/video:scrub)
(lambda (response)
(let ((position (plist-get response :position)))
(message "current position %S" position)
(cond (timeout? nil)
((or (null position) (zerop position))
(deferred:nextc (deferred:succeed) interval))
(t t))))))))
(deferred:$
(deferred:timeout
limit nil
(deferred:next d))
(deferred:nextc it
(lambda (x) ;; 動画スタートチェックタスクのストップ処理用
(setq timeout? t)
x))))))
(deferred:nextc (airplay/video:--buffering?)
(lambda (result)
(message "%s" (if result "success!" "timeout.."))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment