package io.trane.future;
interface WaitQueue<T> {
WaitQueue<T> add(Continuation<T, ?> c);
void flush(Future<T> result);
void forward(Promise<T> target);
}
final class WaitQueueHeadTail<T> implements WaitQueue<T> {
private final Continuation<T, ?> head;
private final WaitQueue<T> tail;
WaitQueueHeadTail(final Continuation<T, ?> head, final WaitQueue<T> tail) {
this.head = head;
this.tail = tail;
}
@Override
public final WaitQueue<T> add(final Continuation<T, ?> c) {
return new WaitQueueHeadTail<>(c, this);
}
@Override
public final void flush(final Future<T> result) {
WaitQueue<T> t = this;
while (t instanceof WaitQueueHeadTail) {
final WaitQueueHeadTail<T> l = (WaitQueueHeadTail<T>) t;
l.head.flush(result);
t = l.tail;
}
t.flush(result);
}
@SuppressWarnings("unchecked")
@Override
public final void forward(final Promise<T> target) {
WaitQueue<T> t = this;
while (t instanceof WaitQueueHeadTail) {
final WaitQueueHeadTail<T> l = (WaitQueueHeadTail<T>) t;
target.continuation(l.head);
t = l.tail;
}
target.continuation((Continuation<T, ?>) t);
}
}