import { Item } from './item';
import { Settings } from './settings';
import { Logger } from './logger';
import { Reactive } from './reactive';
import { Direction } from '../inputs/index';
import { OnDataChanged, BufferUpdater, ItemsPredicate } from '../interfaces/index';
export declare class Buffer<Data> {
  private _items;
  private _absMinIndex;
  private _absMaxIndex;
  bof: Reactive<boolean>;
  eof: Reactive<boolean>;
  changeItems: OnDataChanged<Data>;
  minIndexUser: number;
  maxIndexUser: number;
  startIndexUser: number;
  startIndex: number;
  private pristine;
  private cache;
  private checkCall;
  private readonly logger;
  constructor(settings: Settings<Data>, onDataChanged: OnDataChanged<Data>, logger: Logger);
  dispose(): void;
  reset(force: boolean, startIndex?: number): void;
  setCurrentStartIndex(newStartIndex?: unknown): void;
  set items(items: Item<Data>[]);
  get items(): Item<Data>[];
  set absMinIndex(value: number);
  get absMinIndex(): number;
  set absMaxIndex(value: number);
  get absMaxIndex(): number;
  private checkBOF;
  private checkEOF;
  get size(): number;
  get cacheSize(): number;
  get defaultSize(): number;
  get minIndex(): number;
  get maxIndex(): number;
  get firstIndex(): number;
  get lastIndex(): number;
  get finiteAbsMinIndex(): number;
  get finiteAbsMaxIndex(): number;
  get($index: number): Item<Data> | undefined;
  setItems(items: Item<Data>[]): boolean;
  clip(): void;
  getIndexToInsert(predicate?: ItemsPredicate, before?: number, after?: number): number;
  private shiftExtremum;
  insertVirtually(items: Data[], index: number, direction: Direction, fixRight: boolean): boolean;
  removeVirtually(indexes: number[], fixRight: boolean): void;
  fillEmpty(items: Data[], beforeIndex: number | undefined, afterIndex: number | undefined, fixRight: boolean, generator: (index: number, data: Data) => Item<Data>): boolean;
  updateItems(predicate: BufferUpdater<Data>, generator: (index: number, data: Data) => Item<Data>, indexToTrack: number, fixRight: boolean): {
    trackedIndex: number;
    toRemove: Item<Data>[];
  };
  cacheItem(item: Item<Data>): void;
  getFirstVisibleItemIndex(): number;
  getLastVisibleItemIndex(): number;
  getFirstVisibleItem(): Item<Data> | undefined;
  getLastVisibleItem(): Item<Data> | undefined;
  getEdgeVisibleItem(direction: Direction, opposite?: boolean): Item<Data> | undefined;
  getVisibleItemsCount(): number;
  getSizeByIndex(index: number): number;
  checkDefaultSize(): boolean;
}
