[go: nahoru, domu]

blob: 8775b38e986db9a35fb6d7f6d5c588e0c7ed1988 [file] [log] [blame]
Jan Scheffler16b7c0c2021-04-14 15:58:141// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Jan Scheffler16b7c0c2021-04-14 15:58:145import * as Common from '../../core/common/common.js';
6import * as Platform from '../../core/platform/platform.js';
7
8export class ListModel<T> extends Common.ObjectWrapper.ObjectWrapper implements Iterable<T> {
Jan Scheffler01eab3c2021-08-16 17:18:079 private items: T[];
Jan Scheffler16b7c0c2021-04-14 15:58:1410 constructor(items?: T[]) {
11 super();
Jan Scheffler01eab3c2021-08-16 17:18:0712 this.items = items || [];
Jan Scheffler16b7c0c2021-04-14 15:58:1413 }
14
15 // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
16 // eslint-disable-next-line @typescript-eslint/no-explicit-any
17 [Symbol.iterator](): Iterator<T, any, undefined> {
Jan Scheffler01eab3c2021-08-16 17:18:0718 return this.items[Symbol.iterator]();
Jan Scheffler16b7c0c2021-04-14 15:58:1419 }
20
21 get length(): number {
Jan Scheffler01eab3c2021-08-16 17:18:0722 return this.items.length;
Jan Scheffler16b7c0c2021-04-14 15:58:1423 }
24
25 at(index: number): T {
Jan Scheffler01eab3c2021-08-16 17:18:0726 return this.items[index];
Jan Scheffler16b7c0c2021-04-14 15:58:1427 }
28
29 every(callback: (arg0: T) => boolean): boolean {
Jan Scheffler01eab3c2021-08-16 17:18:0730 return this.items.every(callback);
Jan Scheffler16b7c0c2021-04-14 15:58:1431 }
32
33 filter(callback: (arg0: T) => boolean): T[] {
Jan Scheffler01eab3c2021-08-16 17:18:0734 return this.items.filter(callback);
Jan Scheffler16b7c0c2021-04-14 15:58:1435 }
36
37 find(callback: (arg0: T) => boolean): T|undefined {
Jan Scheffler01eab3c2021-08-16 17:18:0738 return this.items.find(callback);
Jan Scheffler16b7c0c2021-04-14 15:58:1439 }
40
41 findIndex(callback: (arg0: T) => boolean): number {
Jan Scheffler01eab3c2021-08-16 17:18:0742 return this.items.findIndex(callback);
Jan Scheffler16b7c0c2021-04-14 15:58:1443 }
44
45 indexOf(value: T, fromIndex?: number): number {
Jan Scheffler01eab3c2021-08-16 17:18:0746 return this.items.indexOf(value, fromIndex);
Jan Scheffler16b7c0c2021-04-14 15:58:1447 }
48
49 insert(index: number, value: T): void {
Jan Scheffler01eab3c2021-08-16 17:18:0750 this.items.splice(index, 0, value);
51 this.replaced(index, [], 1);
Jan Scheffler16b7c0c2021-04-14 15:58:1452 }
53
54 insertWithComparator(value: T, comparator: (arg0: T, arg1: T) => number): void {
Jan Scheffler01eab3c2021-08-16 17:18:0755 this.insert(Platform.ArrayUtilities.lowerBound(this.items, value, comparator), value);
Jan Scheffler16b7c0c2021-04-14 15:58:1456 }
57
58 join(separator?: string): string {
Jan Scheffler01eab3c2021-08-16 17:18:0759 return this.items.join(separator);
Jan Scheffler16b7c0c2021-04-14 15:58:1460 }
61
62 remove(index: number): T {
Jan Scheffler01eab3c2021-08-16 17:18:0763 const result = this.items[index];
64 this.items.splice(index, 1);
65 this.replaced(index, [result], 0);
Jan Scheffler16b7c0c2021-04-14 15:58:1466 return result;
67 }
68
69 replace(index: number, value: T, keepSelectedIndex?: boolean): T {
Jan Scheffler01eab3c2021-08-16 17:18:0770 const oldValue = this.items[index];
71 this.items[index] = value;
72 this.replaced(index, [oldValue], 1, keepSelectedIndex);
Jan Scheffler16b7c0c2021-04-14 15:58:1473 return oldValue;
74 }
75
76 replaceRange(from: number, to: number, items: T[]): T[] {
77 let removed;
78 if (items.length < 10000) {
Jan Scheffler01eab3c2021-08-16 17:18:0779 removed = this.items.splice(from, to - from, ...items);
Jan Scheffler16b7c0c2021-04-14 15:58:1480 } else {
Jan Scheffler01eab3c2021-08-16 17:18:0781 removed = this.items.slice(from, to);
Jan Scheffler16b7c0c2021-04-14 15:58:1482 // Splice may fail with too many arguments.
Jan Scheffler01eab3c2021-08-16 17:18:0783 const before = this.items.slice(0, from);
84 const after = this.items.slice(to);
85 this.items = [...before, ...items, ...after];
Jan Scheffler16b7c0c2021-04-14 15:58:1486 }
Jan Scheffler01eab3c2021-08-16 17:18:0787 this.replaced(from, removed, items.length);
Jan Scheffler16b7c0c2021-04-14 15:58:1488 return removed;
89 }
90
91 replaceAll(items: T[]): T[] {
Jan Scheffler01eab3c2021-08-16 17:18:0792 const oldItems = this.items.slice();
93 this.items = items;
94 this.replaced(0, oldItems, items.length);
Jan Scheffler16b7c0c2021-04-14 15:58:1495 return oldItems;
96 }
97
98 slice(from?: number, to?: number): T[] {
Jan Scheffler01eab3c2021-08-16 17:18:0799 return this.items.slice(from, to);
Jan Scheffler16b7c0c2021-04-14 15:58:14100 }
101
102 some(callback: (arg0: T) => boolean): boolean {
Jan Scheffler01eab3c2021-08-16 17:18:07103 return this.items.some(callback);
Jan Scheffler16b7c0c2021-04-14 15:58:14104 }
105
Jan Scheffler01eab3c2021-08-16 17:18:07106 private replaced(index: number, removed: T[], inserted: number, keepSelectedIndex?: boolean): void {
Jan Scheffler16b7c0c2021-04-14 15:58:14107 this.dispatchEventToListeners(Events.ItemsReplaced, {index, removed, inserted, keepSelectedIndex});
108 }
109}
110
111// TODO(crbug.com/1167717): Make this a const enum again
112// eslint-disable-next-line rulesdir/const_enum
113export enum Events {
114 ItemsReplaced = 'ItemsReplaced',
115}