Skip to content

Commit fdf0744

Browse files
committed
fix(json-crdt-extensions): 🐛 improve .getOrNextHigher()
1 parent 32b481d commit fdf0744

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {printTree} from 'tree-dump/lib/printTree';
22
import {printBinary} from 'tree-dump/lib/printBinary';
3-
import {first, insertLeft, insertRight, next, prev, remove} from 'sonic-forest/lib/util';
3+
import {first, insertLeft, insertRight, last, next, prev, remove} from 'sonic-forest/lib/util';
44
import {splay} from 'sonic-forest/lib/splay/util';
55
import {Anchor} from '../rga/constants';
66
import {Point} from '../rga/Point';
@@ -45,6 +45,10 @@ export class Overlay<T = string> implements Printable, Stateful {
4545
return this.root ? first(this.root) : undefined;
4646
}
4747

48+
public last(): OverlayPoint<T> | undefined {
49+
return this.root ? last(this.root) : undefined;
50+
}
51+
4852
public iterator(): () => OverlayPoint<T> | undefined {
4953
let curr = this.first();
5054
return () => {
@@ -98,9 +102,11 @@ export class Overlay<T = string> implements Printable, Stateful {
98102
* Retrieve overlay point or the next one, measured in spacial dimension.
99103
*/
100104
public getOrNextHigher(point: Point<T>): OverlayPoint<T> | undefined {
101-
if (point.isAbsEnd()) point = this.txt.pointEnd()!;
102-
else if (point.isAbsStart()) {
103-
return undefined;
105+
if (point.isAbsEnd()) {
106+
const last = this.last();
107+
if (!last) return;
108+
if (last.isAbsEnd()) return last;
109+
point = last;
104110
}
105111
let curr: OverlayPoint<T> | undefined = this.root;
106112
let result: OverlayPoint<T> | undefined = undefined;
@@ -111,7 +117,7 @@ export class Overlay<T = string> implements Printable, Stateful {
111117
else {
112118
const next = curr.l;
113119
result = curr;
114-
if (!next) return result;
120+
if (!next) return;
115121
curr = next;
116122
}
117123
}

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

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import {size} from 'sonic-forest/lib/util';
33
import {Peritext} from '../../Peritext';
44
import {Anchor} from '../../rga/constants';
55
import {setupNumbersWithTombstones} from '../../__tests__/setup';
6+
import {OverlayPoint} from '../OverlayPoint';
7+
import {OverlayRefSliceEnd, OverlayRefSliceStart} from '../refs';
68

79
describe('.getOrNextLower()', () => {
810
test('combines overlay points - right anchor', () => {
@@ -120,14 +122,28 @@ describe('.getOrNextHigher()', () => {
120122
});
121123

122124
describe('when all text selected, using absolute range', () => {
123-
test.skip('...', () => {
125+
test('can select the ending point', () => {
124126
const {peritext, editor} = setupNumbersWithTombstones();
125127
const range = peritext.range(peritext.pointAbsStart(), peritext.pointAbsEnd());
126128
editor.cursor.setRange(range);
127129
peritext.refresh();
128-
console.log(peritext + '');
129-
// const overlayPoint = peritext.overlay.getOrNextHigher(peritext.pointAbsStart())!;
130-
// expect(overlayPoint).toBe(undefined);
130+
const overlayPoint = peritext.overlay.getOrNextHigher(peritext.pointAbsEnd())!;
131+
expect(overlayPoint).toBeInstanceOf(OverlayPoint);
132+
expect(overlayPoint.refs.length).toBe(1);
133+
expect(overlayPoint.refs[0]).toEqual(new OverlayRefSliceEnd(editor.cursor));
134+
});
135+
136+
test('can select the start point', () => {
137+
const {peritext, editor} = setupNumbersWithTombstones();
138+
const range = peritext.range(peritext.pointAbsStart(), peritext.pointAbsEnd());
139+
editor.cursor.setRange(range);
140+
peritext.refresh();
141+
const overlayPoint = peritext.overlay.getOrNextHigher(peritext.pointAbsStart()!)!;
142+
expect(overlayPoint).toBeInstanceOf(OverlayPoint);
143+
expect(overlayPoint.refs.length).toBe(1);
144+
expect(overlayPoint.refs[0]).toEqual(new OverlayRefSliceStart(editor.cursor));
145+
expect(overlayPoint.layers.length).toBe(1);
146+
expect(overlayPoint.layers[0]).toEqual(editor.cursor);
131147
});
132148
});
133149
});

0 commit comments

Comments
 (0)