package xapi.gwt.collect; import java.util.Iterator; import xapi.collect.api.Fifo; import com.google.gwt.core.client.JavaScriptObject; public class JsFifo<E> extends JavaScriptObject implements Fifo<E> { protected JsFifo() { } public native static <E> Fifo<E> newFifo() /*-{ return []; }-*/; @Override public final native void clear() /*-{ this.length = 0; }-*/; @Override public final boolean contains(E item) { for (E e : forEach()) { if (e.equals(item)) return true; } return false; } @Override public final native Fifo<E> give(E item) /*-{ if (item !== null) this.push(item); return this; }-*/; @Override @SuppressWarnings("unchecked") public final native Fifo<E> giveAll(E... elements) /*-{ this.splice(this.length, elements); return this; }-*/; @Override public final Fifo<E> giveAll(Iterable<E> elements) { return null; } @Override public final native boolean isEmpty() /*-{ return this.length==0; }-*/; @Override public final Iterator<E> iterator() { return new JsArrayIterator<E>(this); } @Override public final Iterable<E> forEach() { class Itr implements Iterable<E> { @Override public Iterator<E> iterator() { return JsFifo.this.iterator(); } } return new Itr(); } @Override public final boolean remove(E item) { boolean removed = false; for (int i = size(); i-- > 0;) { if (equal(item, i)) { remove(i); removed = true; } } return removed; } @Override public final native int size() /*-{ return this.length; }-*/; @Override public final native E take() /*-{ return this.length==0?null:this.shift(); }-*/; private final native void remove(int i) /*-{ this.splice(i, 1); }-*/; private final native boolean equal(E item, int i) /*-{ return this[i] === item; }-*/; public final native String join(String delim) /*-{ return this.join(delim); }-*/; }