12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import { ArrayNavigator } from './navigator.js';
- export class HistoryNavigator {
- constructor(history = [], limit = 10) {
- this._initialize(history);
- this._limit = limit;
- this._onChange();
- }
- getHistory() {
- return this._elements;
- }
- add(t) {
- this._history.delete(t);
- this._history.add(t);
- this._onChange();
- }
- next() {
- if (this._currentPosition() !== this._elements.length - 1) {
- return this._navigator.next();
- }
- return null;
- }
- previous() {
- if (this._currentPosition() !== 0) {
- return this._navigator.previous();
- }
- return null;
- }
- current() {
- return this._navigator.current();
- }
- first() {
- return this._navigator.first();
- }
- last() {
- return this._navigator.last();
- }
- has(t) {
- return this._history.has(t);
- }
- _onChange() {
- this._reduceToLimit();
- const elements = this._elements;
- this._navigator = new ArrayNavigator(elements, 0, elements.length, elements.length);
- }
- _reduceToLimit() {
- const data = this._elements;
- if (data.length > this._limit) {
- this._initialize(data.slice(data.length - this._limit));
- }
- }
- _currentPosition() {
- const currentElement = this._navigator.current();
- if (!currentElement) {
- return -1;
- }
- return this._elements.indexOf(currentElement);
- }
- _initialize(history) {
- this._history = new Set();
- for (const entry of history) {
- this._history.add(entry);
- }
- }
- get _elements() {
- const elements = [];
- this._history.forEach(e => elements.push(e));
- return elements;
- }
- }
|