That is when problems started to occur. While seque optionally takes a BlockingQueue as argument, it is not made to support exotic queues like SynchronousQueue(for Begame) and PriorityBlockingQueue(for heapsort), which do a bit more than just threading items through a queue.

Long story short, I submitted a bug report and wrote something that works for me.

Update: I'm not even sure It's possible anymore to write seque so that it works in all cases.

(nstest(:import[java.util.concurrentBlockingQueueLinkedBlockingQueueSynchronousQueuePriorityBlockingQueueCyclicBarrier])(:useclojure.test)(:refer-clojure:exclude[seque]));; some BlockingQueues are...;; not ordered;; not finite;; unable to contain nil;; without content;; mutable;; dropping or recieving extra items;; seque...;; fills the que on another thread;; propagates errors;; replaces nil with a sentinel;; detects the end of the input seq;; can be consumed on any thread(defnseque"Creates a queued seq on another (presumably lazy) seq s. The queued
seq will produce a concrete seq in the background, and can get up to
n items ahead of the consumer. n-or-q can be an integer n buffer
size, or an instance of java.util.concurrent BlockingQueue. Note
that reading from a seque can block if the reader gets ahead of the
producer."{:added"1.0"}([s](seque100s))([n-or-qs](let[^BlockingQueueq(if(instance?BlockingQueuen-or-q)n-or-q(LinkedBlockingQueue.(intn-or-q)))NIL(Object.);nil sentinel since BQ doesn't support nilss(map(fnilidentityNIL)s)channel(LinkedBlockingQueue.)fill(fnfill[s](try(if(seqs)(do(.putchannel#(.takeq))(.putq(firsts))(recur(nexts)))(.putchannel#(throw(InterruptedException.))))(catchExceptione(.putchannel#(throwe)))))fut(future(fills))drain(fndrain[](lazy-seq(try(cons((.takechannel))(drain))(catchInterruptedExceptionenil))))](map#(if(identical?%NIL)nil%)(drain)))))(defntrickle[slow](map#(do(Thread/sleep100)%)slow))(deftestidentity?(is(=(seque(range10))(range10))))(deftestpriority(is(=4(count(seque(PriorityBlockingQueue.)[:a:b:c:a])))))(deftestsynchronous(is(=(seque(SynchronousQueue.)(range10))(range10))))(deftestnils(is(=(seque[niltruefalse[]])[niltruefalse[]])))(deftesterrors(is(thrown?Throwable(dorun(seque(map#(throw(Exception.(str%)))(range10)))))))(deftestthreads(let[s(seque(SynchronousQueue.)(range10))f1(future(doalls))f2(future(doalls))](is(=(range10)@f1@f2))))(defnmoronic[]; untestable(let[q(LinkedBlockingQueue.100)](future(dotimes[_1000](Thread/yield)(.pollq)))(future(dotimes[_1000](Thread/yield)(.offerq:foo)))(sequeq(range1000))))