interface FAIterator { public function current(); public function next(); public function hasNext(); public function reset(); public function key(); } class FAProxyIterator implements FAIterator { private var _it:FAIterator; public function FAProxyIterator(it:FAIterator) { _it = it; } public function current() { return _it.current(); } public function next() { return _it.next(); } public function reset() { return _it.reset(); } public function key() { return _it.key(); } public function hasNext() { return _it.hasNext(); } } class FAArrayIterator implements FAIterator { private var _elems:Array; private var _index:Number = -1; private var _size:Number = 0; public function FAArrayIterator(elems:Array) { _elems = elems; _size = _elems.length; } public function next() { var ret:Boolean; if(ret = this.hasNext()) { _index++; } return ret; } public function current() { return _elems[this.key()]; } public function hasNext() { return (_size > _index + 1); } public function reset() { _index = -1; return true; } public function key() { return _index; } }