@fluidframework/merge-tree 1.2.1 → 2.0.0-internal.1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEV.md +2 -2
- package/README.md +1 -1
- package/REFERENCEPOSITIONS.md +2 -2
- package/dist/MergeTreeTextHelper.d.ts +23 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -0
- package/dist/MergeTreeTextHelper.js +136 -0
- package/dist/MergeTreeTextHelper.js.map +1 -0
- package/dist/base.d.ts +2 -26
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js.map +1 -1
- package/dist/client.d.ts +21 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +87 -27
- package/dist/client.js.map +1 -1
- package/dist/collections/heap.d.ts +28 -0
- package/dist/collections/heap.d.ts.map +1 -0
- package/dist/collections/heap.js +65 -0
- package/dist/collections/heap.js.map +1 -0
- package/dist/collections/index.d.ts +11 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +23 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/intervalTree.d.ts +60 -0
- package/dist/collections/intervalTree.d.ts.map +1 -0
- package/dist/collections/intervalTree.js +99 -0
- package/dist/collections/intervalTree.js.map +1 -0
- package/dist/collections/list.d.ts +39 -0
- package/dist/collections/list.d.ts.map +1 -0
- package/dist/collections/list.js +155 -0
- package/dist/collections/list.js.map +1 -0
- package/dist/collections/rbTree.d.ts +154 -0
- package/dist/collections/rbTree.d.ts.map +1 -0
- package/dist/{collections.js → collections/rbTree.js} +10 -448
- package/dist/collections/rbTree.js.map +1 -0
- package/dist/collections/stack.d.ts +16 -0
- package/dist/collections/stack.d.ts.map +1 -0
- package/dist/collections/stack.js +30 -0
- package/dist/collections/stack.js.map +1 -0
- package/dist/collections/tst.d.ts +55 -0
- package/dist/collections/tst.d.ts.map +1 -0
- package/dist/collections/tst.js +171 -0
- package/dist/collections/tst.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/localReference.d.ts +48 -99
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +132 -169
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +38 -299
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +214 -598
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +269 -0
- package/dist/mergeTreeNodes.d.ts.map +1 -0
- package/dist/mergeTreeNodes.js +383 -0
- package/dist/mergeTreeNodes.js.map +1 -0
- package/dist/mergeTreeTracking.d.ts +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +1 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js.map +1 -1
- package/dist/partialLengths.d.ts +130 -15
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +230 -138
- package/dist/partialLengths.js.map +1 -1
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js.map +1 -1
- package/dist/referencePositions.d.ts +6 -26
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +2 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +3 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +10 -1
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +41 -6
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +5 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -0
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/textSegment.d.ts +7 -7
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -125
- package/dist/textSegment.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts +23 -0
- package/lib/MergeTreeTextHelper.d.ts.map +1 -0
- package/lib/MergeTreeTextHelper.js +132 -0
- package/lib/MergeTreeTextHelper.js.map +1 -0
- package/lib/base.d.ts +2 -26
- package/lib/base.d.ts.map +1 -1
- package/lib/base.js.map +1 -1
- package/lib/client.d.ts +21 -12
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +85 -25
- package/lib/client.js.map +1 -1
- package/lib/collections/heap.d.ts +28 -0
- package/lib/collections/heap.d.ts.map +1 -0
- package/lib/collections/heap.js +61 -0
- package/lib/collections/heap.js.map +1 -0
- package/lib/collections/index.d.ts +11 -0
- package/lib/collections/index.d.ts.map +1 -0
- package/lib/collections/index.js +11 -0
- package/lib/collections/index.js.map +1 -0
- package/lib/collections/intervalTree.d.ts +60 -0
- package/lib/collections/intervalTree.d.ts.map +1 -0
- package/lib/collections/intervalTree.js +94 -0
- package/lib/collections/intervalTree.js.map +1 -0
- package/lib/collections/list.d.ts +39 -0
- package/lib/collections/list.d.ts.map +1 -0
- package/lib/collections/list.js +149 -0
- package/lib/collections/list.js.map +1 -0
- package/lib/collections/rbTree.d.ts +154 -0
- package/lib/collections/rbTree.d.ts.map +1 -0
- package/lib/{collections.js → collections/rbTree.js} +9 -439
- package/lib/collections/rbTree.js.map +1 -0
- package/lib/collections/stack.d.ts +16 -0
- package/lib/collections/stack.d.ts.map +1 -0
- package/lib/collections/stack.js +26 -0
- package/lib/collections/stack.js.map +1 -0
- package/lib/collections/tst.d.ts +55 -0
- package/lib/collections/tst.d.ts.map +1 -0
- package/lib/collections/tst.js +167 -0
- package/lib/collections/tst.js.map +1 -0
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/localReference.d.ts +48 -99
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +132 -170
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +38 -299
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +190 -563
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +269 -0
- package/lib/mergeTreeNodes.d.ts.map +1 -0
- package/lib/mergeTreeNodes.js +369 -0
- package/lib/mergeTreeNodes.js.map +1 -0
- package/lib/mergeTreeTracking.d.ts +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +1 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js.map +1 -1
- package/lib/partialLengths.d.ts +130 -15
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +227 -135
- package/lib/partialLengths.js.map +1 -1
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js.map +1 -1
- package/lib/referencePositions.d.ts +6 -26
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +2 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +3 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +10 -1
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +41 -6
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +5 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -0
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/textSegment.d.ts +7 -7
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +1 -122
- package/lib/textSegment.js.map +1 -1
- package/package.json +93 -17
- package/src/MergeTreeTextHelper.ts +172 -0
- package/src/base.ts +2 -35
- package/src/client.ts +114 -30
- package/src/collections/heap.ts +75 -0
- package/src/collections/index.ts +11 -0
- package/src/collections/intervalTree.ts +140 -0
- package/src/collections/list.ts +165 -0
- package/src/{collections.ts → collections/rbTree.ts} +79 -538
- package/src/collections/stack.ts +27 -0
- package/src/collections/tst.ts +212 -0
- package/src/index.ts +8 -2
- package/src/localReference.ts +152 -203
- package/src/mergeTree.ts +265 -868
- package/src/mergeTreeDeltaCallback.ts +1 -1
- package/src/mergeTreeNodes.ts +676 -0
- package/src/mergeTreeTracking.ts +1 -1
- package/src/opBuilder.ts +1 -1
- package/src/partialLengths.ts +295 -150
- package/src/properties.ts +1 -0
- package/src/referencePositions.ts +7 -27
- package/src/segmentGroupCollection.ts +5 -1
- package/src/segmentPropertiesManager.ts +45 -6
- package/src/snapshotLoader.ts +2 -1
- package/src/snapshotV1.ts +2 -2
- package/src/snapshotlegacy.ts +6 -2
- package/src/sortedSegmentSet.ts +1 -1
- package/src/textSegment.ts +10 -157
- package/dist/collections.d.ts +0 -197
- package/dist/collections.d.ts.map +0 -1
- package/dist/collections.js.map +0 -1
- package/lib/collections.d.ts +0 -197
- package/lib/collections.d.ts.map +0 -1
- package/lib/collections.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export * from "./heap";
|
|
7
|
+
export * from "./intervalTree";
|
|
8
|
+
export * from "./list";
|
|
9
|
+
export * from "./rbTree";
|
|
10
|
+
export * from "./stack";
|
|
11
|
+
export * from "./tst";
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
7
|
+
import {
|
|
8
|
+
IIntegerRange,
|
|
9
|
+
} from "../base";
|
|
10
|
+
import { ConflictAction, IRBAugmentation, IRBMatcher, RBNode, RBNodeActions, RedBlackTree } from "./rbTree";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated for internal use only. public export will be removed.
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export interface AugmentedIntervalNode {
|
|
17
|
+
minmax: IInterval;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @deprecated for internal use only. public export will be removed.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export const integerRangeToString = (range: IIntegerRange) => `[${range.start},${range.end})`;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated for internal use only. public export will be removed.
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export interface IInterval {
|
|
31
|
+
clone(): IInterval;
|
|
32
|
+
compare(b: IInterval): number;
|
|
33
|
+
compareStart(b: IInterval): number;
|
|
34
|
+
compareEnd(b: IInterval): number;
|
|
35
|
+
modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage): IInterval | undefined;
|
|
36
|
+
overlaps(b: IInterval): boolean;
|
|
37
|
+
union(b: IInterval): IInterval;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const intervalComparer = (a: IInterval, b: IInterval) => a.compare(b);
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated for internal use only. public export will be removed.
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;
|
|
46
|
+
/**
|
|
47
|
+
* @deprecated for internal use only. public export will be removed.
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
export type IntervalConflictResolver<TInterval> = (a: TInterval, b: TInterval) => TInterval;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @deprecated for internal use only. public export will be removed.
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
export class IntervalTree<T extends IInterval> implements IRBAugmentation<T, AugmentedIntervalNode>,
|
|
57
|
+
IRBMatcher<T, AugmentedIntervalNode> {
|
|
58
|
+
public intervals = new RedBlackTree<T, AugmentedIntervalNode>(intervalComparer, this);
|
|
59
|
+
|
|
60
|
+
public remove(x: T) {
|
|
61
|
+
this.intervals.remove(x);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public removeExisting(x: T) {
|
|
65
|
+
this.intervals.removeExisting(x);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public put(x: T, conflict?: IntervalConflictResolver<T>) {
|
|
69
|
+
let rbConflict: ConflictAction<T, AugmentedIntervalNode> | undefined;
|
|
70
|
+
if (conflict) {
|
|
71
|
+
rbConflict = (key: T, currentKey: T) => {
|
|
72
|
+
const ival = conflict(key, currentKey);
|
|
73
|
+
return {
|
|
74
|
+
key: ival,
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
this.intervals.put(x, { minmax: x.clone() }, rbConflict);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public map(fn: (x: T) => void) {
|
|
82
|
+
const actions: RBNodeActions<T, AugmentedIntervalNode> = {
|
|
83
|
+
infix: (node) => {
|
|
84
|
+
fn(node.key);
|
|
85
|
+
return true;
|
|
86
|
+
},
|
|
87
|
+
showStructure: true,
|
|
88
|
+
};
|
|
89
|
+
this.intervals.walk(actions);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public mapUntil(fn: (X: T) => boolean) {
|
|
93
|
+
const actions: RBNodeActions<T, AugmentedIntervalNode> = {
|
|
94
|
+
infix: (node) => {
|
|
95
|
+
return fn(node.key);
|
|
96
|
+
},
|
|
97
|
+
showStructure: true,
|
|
98
|
+
};
|
|
99
|
+
this.intervals.walk(actions);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public mapBackward(fn: (x: T) => void) {
|
|
103
|
+
const actions: RBNodeActions<T, AugmentedIntervalNode> = {
|
|
104
|
+
infix: (node) => {
|
|
105
|
+
fn(node.key);
|
|
106
|
+
return true;
|
|
107
|
+
},
|
|
108
|
+
showStructure: true,
|
|
109
|
+
};
|
|
110
|
+
this.intervals.walkBackward(actions);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// TODO: toString()
|
|
114
|
+
public match(x: T) {
|
|
115
|
+
return this.intervals.gather(x, this);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public matchNode(node: IntervalNode<T> | undefined, key: T) {
|
|
119
|
+
return !!node && node.key.overlaps(key);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public continueSubtree(node: IntervalNode<T> | undefined, key: T) {
|
|
123
|
+
return !!node && node.data.minmax.overlaps(key);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public update(node: IntervalNode<T>) {
|
|
127
|
+
if (node.left && node.right) {
|
|
128
|
+
node.data.minmax = node.key.union(
|
|
129
|
+
node.left.data.minmax.union(node.right.data.minmax));
|
|
130
|
+
} else {
|
|
131
|
+
if (node.left) {
|
|
132
|
+
node.data.minmax = node.key.union(node.left.data.minmax);
|
|
133
|
+
} else if (node.right) {
|
|
134
|
+
node.data.minmax = node.key.union(node.right.data.minmax);
|
|
135
|
+
} else {
|
|
136
|
+
node.data.minmax = node.key.clone();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @deprecated for internal use only. public export will be removed.
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export function ListRemoveEntry<U>(entry: List<U>): List<U> | undefined {
|
|
11
|
+
if (entry === undefined) {
|
|
12
|
+
return undefined;
|
|
13
|
+
} else if (entry.isHead) {
|
|
14
|
+
return undefined;
|
|
15
|
+
} else {
|
|
16
|
+
entry.next.prev = entry.prev;
|
|
17
|
+
entry.prev.next = entry.next;
|
|
18
|
+
entry.next = deadhead;
|
|
19
|
+
entry.prev = deadhead;
|
|
20
|
+
}
|
|
21
|
+
return (entry);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function ListMakeEntry<U>(data: U): List<U> {
|
|
25
|
+
return new List<U>(false, data);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @deprecated for internal use only. public export will be removed.
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export function ListMakeHead<U>(): List<U> {
|
|
33
|
+
return new List<U>(true, undefined);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated for internal use only. public export will be removed.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export class List<T> {
|
|
41
|
+
public next: List<T>;
|
|
42
|
+
public prev: List<T>;
|
|
43
|
+
|
|
44
|
+
constructor(public isHead: boolean, public data: T | undefined) {
|
|
45
|
+
this.prev = this;
|
|
46
|
+
this.next = this;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public clear(): void {
|
|
50
|
+
if (this.isHead) {
|
|
51
|
+
this.prev = this;
|
|
52
|
+
this.next = this;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private add(data: T): List<T> {
|
|
57
|
+
const entry = ListMakeEntry(data);
|
|
58
|
+
this.prev.next = entry;
|
|
59
|
+
entry.next = this;
|
|
60
|
+
entry.prev = this.prev;
|
|
61
|
+
this.prev = entry;
|
|
62
|
+
return (entry);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public dequeue(): T | undefined {
|
|
66
|
+
if (!this.empty()) {
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
68
|
+
const removedEntry = ListRemoveEntry(this.next)!;
|
|
69
|
+
return removedEntry.data;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public enqueue(data: T): List<T> {
|
|
74
|
+
return this.add(data);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public pop?(): T | undefined {
|
|
78
|
+
const removedEntry = ListRemoveEntry(this.prev);
|
|
79
|
+
return removedEntry ? removedEntry.data : undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public walk(fn: (data: T, l: List<T>) => void): void {
|
|
83
|
+
for (let entry = this.next; !(entry.isHead); entry = entry.next) {
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
85
|
+
fn(entry.data!, entry);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public some(fn: (data: T, l: List<T>) => boolean, rev?: boolean): T[] {
|
|
90
|
+
const rtn: T[] = [];
|
|
91
|
+
const start = rev ? this.prev : this.next;
|
|
92
|
+
for (let entry = start; !(entry.isHead); entry = rev ? entry.prev : entry.next) {
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
94
|
+
const data = entry.data!;
|
|
95
|
+
if (fn(data, entry)) {
|
|
96
|
+
if (rev) {
|
|
97
|
+
// preserve list order when in reverse
|
|
98
|
+
rtn.unshift(data);
|
|
99
|
+
} else {
|
|
100
|
+
rtn.push(data);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return rtn;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public count(): number {
|
|
108
|
+
let entry: List<T>;
|
|
109
|
+
let i: number;
|
|
110
|
+
|
|
111
|
+
entry = this.next;
|
|
112
|
+
for (i = 0; !(entry.isHead); i++) {
|
|
113
|
+
entry = entry.next;
|
|
114
|
+
}
|
|
115
|
+
return (i);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public first(): T | undefined {
|
|
119
|
+
if (!this.empty()) {
|
|
120
|
+
return (this.next.data);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public last(): T | undefined {
|
|
125
|
+
if (!this.empty()) {
|
|
126
|
+
return (this.prev.data);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public empty(): boolean {
|
|
131
|
+
return (this.next === this);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public unshift(data: T): void {
|
|
135
|
+
const entry = ListMakeEntry(data);
|
|
136
|
+
entry.data = data;
|
|
137
|
+
entry.isHead = false;
|
|
138
|
+
entry.next = this.next;
|
|
139
|
+
entry.prev = this;
|
|
140
|
+
this.next = entry;
|
|
141
|
+
entry.next.prev = entry;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public [Symbol.iterator]() {
|
|
145
|
+
let node: List<T> | undefined = this.next;
|
|
146
|
+
const iterator: IterableIterator<T> = {
|
|
147
|
+
next(): IteratorResult<T> {
|
|
148
|
+
while (node && node.isHead === false) {
|
|
149
|
+
const value = node.data;
|
|
150
|
+
node = node.next;
|
|
151
|
+
if (value !== undefined) {
|
|
152
|
+
return { value, done: false };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { value: undefined, done: true };
|
|
156
|
+
},
|
|
157
|
+
[Symbol.iterator]() {
|
|
158
|
+
return this;
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
return iterator;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const deadhead = ListMakeHead<any>();
|