"A queue with a native implementation"
native class NativeDeque() {
    shared native void pushFront(Anything element);
    shared native void pushBack(Anything element);
    shared native Anything popFront();
    shared native Boolean empty;
    shared actual native String string;
}

native("jvm") class NativeDeque() {
    import java.util {
        ArrayDeque,
        Deque
    }

    Deque<Anything> deque = ArrayDeque<Anything>();
    shared native("jvm") void pushFront(Anything element) {
        deque.addFirst(element);
    }
    shared native("jvm") void pushBack(Anything element) {
        deque.addLast(element);
    }
    shared native("jvm") Anything popFront() {
        return deque.pollFirst();
    }
    shared native("jvm") Boolean empty {
        return deque.empty;
    }
    shared actual native("jvm") String string {
        return deque.string;
    }
}

native("js") class NativeDeque() {
    dynamic deque;
    dynamic {
        deque=dynamic[null];
        deque.shift();
    }
    shared native("js") void pushFront(Anything element) {
        dynamic {
            deque.unshift(element);
        }
    }
    shared native("js") void pushBack(Anything element) {
        dynamic {
            deque.push(element);
        }
    }
    shared native("js") Anything popFront() {
        dynamic {
            if (deque.length==0) {
                return null;
            }
            return deque.shift();
        }
    }
    shared native("js") Boolean empty {
        dynamic {
            return deque.length==0;
        }
    }
    shared actual native("js") String string {
        value sb=StringBuilder();
        sb.append("[");
        dynamic {
            for (i in 0:deque.length) {
                if (sb.size > 1) {
                    sb.append(", ");
                }
                sb.append(deque[i]);
            }
        }
        sb.append("]");
        return sb.string;
    }
}