static Producer moveProducerToNewThread(Producer producer, int bufferSize default 65536) { if (producer == null) null; new SimpleCircularBuffer buffer; new Flag done; new Var error; startThread(r { try { A a; while ping ((a = producer.next()) != null) { while (buffer.isFull()) sleep(1); buffer.add(a); } catch e { error.set(e); } finally { done.raise(); } }); ret () -> { while true { A a = buffer.popFirst(); if (a != null) ret a; if (done.isUp()) null; else sleep(1); } }; }