Skip to content

Commit 399b35d

Browse files
committed
🎨 improve: add new type IReadonlyCollection
1 parent f700f6e commit 399b35d

File tree

5 files changed

+27
-31
lines changed

5 files changed

+27
-31
lines changed

Diff for: packages/queue/src/circular.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export class CircularQueue<T = unknown> implements ICircularQueue<T> {
5353
: () => {}
5454
}
5555

56-
public *[Symbol.iterator](): Iterator<T> {
56+
public *[Symbol.iterator](): IterableIterator<T> {
5757
const { _elements, _size, _start, _capacity } = this
5858
if (_size == 0) return
5959

Diff for: packages/queue/src/priority.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class PriorityQueue<T> implements IPriorityQueue<T> {
2020
this._compare = props.compare
2121
}
2222

23-
public *[Symbol.iterator](): Iterator<T> {
23+
public *[Symbol.iterator](): IterableIterator<T> {
2424
const { _elements, _size } = this
2525
for (let i = 1; i <= _size; ++i) yield _elements[i]
2626
}

Diff for: packages/trie/src/trie-unsafe.ts

+14-19
Original file line numberDiff line numberDiff line change
@@ -27,38 +27,34 @@ export class UnsafeTrie<E extends unknown[] | string, V> implements ITrie<E, V>
2727
this._wordCount = 0
2828
}
2929

30-
public get size(): Readonly<number> {
30+
public get size(): number {
3131
return this._wordCount
3232
}
3333

34-
public *[Symbol.iterator](): Iterator<V, number> {
35-
let height = 0
36-
const uStack: number[] = [0]
34+
public *[Symbol.iterator](): IterableIterator<V> {
35+
const vStack: number[] = [0]
3736
const iStack: number[] = [0]
3837
const { _SIGMA_SIZE, _ch, _values } = this
3938

40-
while (height >= 0) {
41-
const o = uStack[height]
39+
for (let h = 0; h >= 0; ) {
40+
const o = vStack[h]
4241
const nodes = _ch[o]
43-
let i = iStack[height]
42+
let i = iStack[h]
4443
while (i < _SIGMA_SIZE && nodes[i] === 0) ++i
4544

4645
if (i < _SIGMA_SIZE) {
4746
const u = nodes[i]
4847
const v = _values[u]
4948
if (v !== undefined) yield v
5049

51-
iStack[height] = i + 1
52-
++height
53-
uStack[height] = u
54-
iStack[height] = 0
50+
iStack[h] = i + 1
51+
++h
52+
vStack[h] = u
53+
iStack[h] = 0
5554
} else {
56-
--height
55+
--h
5756
}
5857
}
59-
60-
// Maximal height of the trie.
61-
return uStack.length
6258
}
6359

6460
public clear(): void {
@@ -103,10 +99,9 @@ export class UnsafeTrie<E extends unknown[] | string, V> implements ITrie<E, V>
10399
}
104100

105101
public delete(element: Readonly<E>, start = 0, end: number = element.length): boolean {
106-
const { _ch, _values, _idx } = this
107-
let i = start
108102
let u = 0
109-
for (; i < end; ++i) {
103+
const { _ch, _values, _idx } = this
104+
for (let i = start; i < end; ++i) {
110105
const c: number = _idx(element[i])
111106
const v: number = _ch[u][c]
112107
if (v === 0) return false
@@ -172,7 +167,7 @@ export class UnsafeTrie<E extends unknown[] | string, V> implements ITrie<E, V>
172167
element: Readonly<E>,
173168
start = 0,
174169
end: number = element.length,
175-
): Iterable<ITrieNodeData<V>> {
170+
): IterableIterator<ITrieNodeData<V>> {
176171
if (start >= end) {
177172
const val = this._values[0]
178173
if (val !== undefined) yield { end: start, val }

Diff for: packages/trie/src/trie.ts

+2-9
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,12 @@ export class Trie<E extends unknown[] | string, V> extends UnsafeTrie<E, V> impl
1111
): this {
1212
if (start < 0) start = 0
1313
if (end > element.length) end = element.length
14-
15-
if (start >= end) super.set(element, value, 0, 0)
16-
else super.set(element, value, start, end)
17-
return this
14+
return super.set(element, value, start, end)
1815
}
1916

2017
public override delete(element: Readonly<E>, start = 0, end: number = element.length): boolean {
2118
if (start < 0) start = 0
2219
if (end > element.length) end = element.length
23-
24-
if (start >= end) return super.delete(element, 0, 0)
2520
return super.delete(element, start, end)
2621
}
2722

@@ -32,8 +27,6 @@ export class Trie<E extends unknown[] | string, V> extends UnsafeTrie<E, V> impl
3227
): V | undefined {
3328
if (start < 0) start = 0
3429
if (end > element.length) end = element.length
35-
36-
if (start >= end) return super.get(element, 0, 0)
3730
return super.get(element, start, end)
3831
}
3932

@@ -65,7 +58,7 @@ export class Trie<E extends unknown[] | string, V> extends UnsafeTrie<E, V> impl
6558
element: Readonly<E>,
6659
start = 0,
6760
end: number = element.length,
68-
): Iterable<ITrieNodeData<V>> {
61+
): IterableIterator<ITrieNodeData<V>> {
6962
if (start < 0) start = 0
7063
if (end > element.length) end = element.length
7164
return super.findAll(element, start, end)

Diff for: packages/types/src/collection.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1-
export interface ICollection<T> extends Iterable<T> {
1+
export interface IReadonlyCollection<T> {
22
/**
33
* Count the element in the collection.
44
* @getter
55
*/
66
readonly size: number
7+
8+
/**
9+
* Iterable.
10+
*/
11+
[Symbol.iterator](): IterableIterator<T>
12+
}
13+
14+
export interface ICollection<T> extends IReadonlyCollection<T> {
715
/**
816
* Release memory.
917
*/

0 commit comments

Comments
 (0)