import {IteratorResultImpl} from './IteratorResultImpl'; export interface List { getSize():number; getItem(index:number):TItem; } export abstract class AbstractIterator implements Iterator { private index:number = 0; constructor(protected rawList:List) { } /** * @override */ public next():IteratorResult { const currentIndex:number = this.index, done:boolean = ++this.index > this.rawList.getSize(); return new IteratorResultImpl(done, this.getItem(this.rawList.getItem(currentIndex))); } protected abstract getItem(currentValue:TItem):TValueItem; } export class DefaultIterator extends AbstractIterator { constructor(protected list:List) { super(list); } /** * @override */ protected getItem(currentValue:TItem):TItem { return currentValue; } } export class ArrayIterator extends DefaultIterator { constructor(protected array:Array) { super({ getSize: ():number => this.array.length, getItem: (index:number):TItem =>this.array[index] }); } }