/***
 * You can create a new instance or inherit and override default methods
 * Allows access to data and size. Clone with rows creates a new data provider and let listview know where to calculate row layout from.
 */
export default class DataProvider {
    public rowHasChanged: (r1: any, r2: any) => boolean;
    private _firstIndexToProcess: number = 0;
    private _size: number = 0;
    private _data: any[] = [];

    constructor(rowHasChanged: (r1: any, r2: any) => boolean) {
        this.rowHasChanged = rowHasChanged;
    }
    public getDataForIndex(index: number): any {
        return this._data[index];
    }

    public getAllData(): any[] {
        return this._data;
    }

    public getSize(): number {
        return this._size;
    }

    public getFirstIndexToProcessInternal(): number {
        return this._firstIndexToProcess;
    }

    //No need to override this one
    public cloneWithRows(newData: any[]): DataProvider {
        const dp = new DataProvider(this.rowHasChanged),
         newSize = newData.length,
         iterCount = Math.min(this._size, newSize);
        let i = 0;

        for (i = 0; i < iterCount; i++) {
            if (this.rowHasChanged(this._data[i], newData[i])) {
                break;
            }
        }
        dp._firstIndexToProcess = i;
        dp._data = newData;
        dp._size = newSize;
        return dp;
    }
}
