(defn- choose [ready-chans] (.take (nth ready-chans (rand-int (count ready-chans))))) (defn- peek-channels [channels] (let [ready (doall (keep #(when-not (nil? (.peek %)) %) channels))] (if (seq ready) (nth ready (rand-int (count ready))) ;; pick at random if >1 ready (Thread/sleep 0 500)))) (defn- probe-til-ready [channels] (loop [chans channels ready-chan nil] (if ready-chan (.take ready-chan) (recur channels (peek-channels channels))))) (defn select [& channels] (let [ready (doall (filterv #(not (nil? (.peek %))) channels))] (if (seq ready) (choose ready) (probe-til-ready channels))))