Skip to content

Commit 8716cfa

Browse files
committed
feat(json-crdt-extensions): 🎸 make Overlay an iterable
1 parent 810771d commit 8716cfa

File tree

4 files changed

+27
-10
lines changed

4 files changed

+27
-10
lines changed

src/json-crdt-extensions/peritext/__tests__/Peritext.overlay.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ const setup = () => {
1919
test('can insert markers', () => {
2020
const {peritext} = setup();
2121
const {editor} = peritext;
22-
expect(peritext.overlay.all().length).toBe(0);
22+
expect([...peritext.overlay].length).toBe(0);
2323
editor.cursor.setAt(0);
2424
peritext.refresh();
25-
expect(peritext.overlay.all().length).toBe(1);
25+
expect([...peritext.overlay].length).toBe(1);
2626
editor.insMarker(['p'], '<p>');
2727
peritext.refresh();
2828
expect(size(peritext.overlay.root)).toBe(2);

src/json-crdt-extensions/peritext/overlay/Overlay.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {compare, ITimestampStruct, tick} from '../../../json-crdt-patch/clock';
1111
import {CONST, updateNum} from '../../../json-hash';
1212
import {MarkerSlice} from '../slice/MarkerSlice';
1313
import {Range} from '../rga/Range';
14+
import {UndefEndIter} from '../../../util/iterator';
1415
import type {Chunk} from '../../../json-crdt/nodes/rga';
1516
import type {Peritext} from '../Peritext';
1617
import type {Stateful} from '../types';
@@ -58,12 +59,12 @@ export class Overlay<T = string> implements Printable, Stateful {
5859
};
5960
}
6061

61-
public all(): OverlayPoint<T>[] {
62-
const iterator = this.iterator();
63-
let point: OverlayPoint<T> | undefined;
64-
const points: OverlayPoint<T>[] = [];
65-
while ((point = iterator())) points.push(point);
66-
return points;
62+
public entries(): IterableIterator<OverlayPoint<T>> {
63+
return new UndefEndIter(this.iterator());
64+
}
65+
66+
[Symbol.iterator]() {
67+
return this.entries();
6768
}
6869

6970
public splitIterator(): () => MarkerOverlayPoint | undefined {

src/json-crdt-extensions/peritext/overlay/__tests__/Overlay.refresh.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ describe('Overlay.refresh()', () => {
3030
editor.cursor.setRange(range);
3131
peritext.refresh();
3232
expect(editor.cursor.text()).toBe('0123456789');
33-
const overlayPoints = overlay.all();
33+
const overlayPoints = [...overlay];
3434
expect(overlayPoints.length).toBe(2);
3535
expect(overlayPoints[0].id.time).toBe(editor.cursor.start.id.time);
3636
expect(overlayPoints[1].id.time).toBe(editor.cursor.end.id.time);
@@ -43,7 +43,7 @@ describe('Overlay.refresh()', () => {
4343
editor.cursor.setRange(range);
4444
peritext.refresh();
4545
expect(editor.cursor.text()).toBe('0123456789');
46-
const overlayPoints = overlay.all();
46+
const overlayPoints = [...overlay];
4747
expect(overlayPoints.length).toBe(2);
4848
expect(overlayPoints[0].id.time).toBe(editor.cursor.start.id.time);
4949
expect(overlayPoints[1].id.time).toBe(editor.cursor.end.id.time);

src/util/iterator.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export class UndefEndIter<T> implements IterableIterator<T> {
2+
constructor(private readonly i: () => T | undefined) {}
3+
4+
public next(): IteratorResult<T> {
5+
const value = this.i();
6+
return new IterRes(value, value === undefined) as IteratorResult<T>;
7+
}
8+
9+
[Symbol.iterator]() {
10+
return this;
11+
}
12+
}
13+
14+
export class IterRes<T> {
15+
constructor(public readonly value: T, public readonly done: boolean) {}
16+
}

0 commit comments

Comments
 (0)