sclass IntBuffer implements Iterable { int[] data; int size; *() {} *(int size) { if (size != 0) data = new int[size]; } *(Iterable l) { this(l(l)); addAll(l); } void add(int i) { if (size >= lIntArray(data)) data = resizeIntArray(data, Math.max(1, lIntArray(data)*2)); data[size++] = i; } void addAll(Iterable l) { if (l != null) for (int i : l) add(i); } int[] toArray() { ret size == 0 ? null : resizeIntArray(data, size); } L toList() { ret intArrayToList(data, 0, size); } L asVirtualList() { ret listFromFunction get(size); } void reset { size = 0; } void clear { reset(); } int size() { ret size; } bool isEmpty() { ret size == 0; } int get(int idx) { if (idx >= size) fail("Index out of range: " + idx + "/" + size); ret data[idx]; } void set(int idx, int value) { if (idx >= size) fail("Index out of range: " + idx + "/" + size); data[idx] = value; } int popLast() { if (size == 0) fail("empty buffer"); ret data[--size]; } int last() { ret data[size-1]; } int nextToLast() { ret data[size-2]; } toString { ret squareBracket(joinWithSpace(toList())); } public Iterator iterator() { ret new ItIt { int i = 0; public bool hasNext() { ret i < size; } public Int next() { if (!hasNext()) fail("Index out of bounds: " + i); ret data[i++]; } }; } }