| (ns cljs.core.async.impl.dispatch |
| (:require [cljs.core.async.impl.buffers :as buffers] |
| [goog.async.nextTick])) |
| |
| (def tasks (buffers/ring-buffer 32)) |
| (def running? false) |
| (def queued? false) |
| |
| (def TASK_BATCH_SIZE 1024) |
| |
| (declare queue-dispatcher) |
| |
| (defn process-messages [] |
| (set! running? true) |
| (set! queued? false) |
| (loop [count 0] |
| (let [m (.pop tasks)] |
| (when-not (nil? m) |
| (m) |
| (when (< count TASK_BATCH_SIZE) |
| (recur (inc count)))))) |
| (set! running? false) |
| (when (> (.-length tasks) 0) |
| (queue-dispatcher))) |
| |
| (defn queue-dispatcher [] |
| (when-not (and queued? running?) |
| (set! queued? true) |
| (goog.async.nextTick process-messages))) |
| |
| (defn run [f] |
| (.unbounded-unshift tasks f) |
| (queue-dispatcher)) |
| |
| (defn queue-delay [f delay] |
| (js/setTimeout f delay)) |
| |