From c817dc656a37a8f4e73234a8387ff3e3242ba24e Mon Sep 17 00:00:00 2001 From: Henri Binsztok <808274+hbbio@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:36:35 +0800 Subject: [PATCH 1/2] cell: update directly from a pointer --- src/cell.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cell.ts b/src/cell.ts index d9ab3ee..b9a670d 100644 --- a/src/cell.ts +++ b/src/cell.ts @@ -779,7 +779,11 @@ export class ValueCell extends Cell { update = ( fn: (v: V) => V | Promise | AnyCell | Promise> ) => { - if (this.isPointer) throw this.newError("Cell is a pointer"); + if (this.isPointer) { + const cell = this._sheet.get(this.pointed); + if (cell instanceof ValueCell) return cell.update(fn); + throw this.newError("Cell is a pointer to a MapCell"); + } // this line is here to help the typechecker //@ts-expect-error isPointer rules out AnyCell const v: V | Error | undefined = this.v; From 94d36523301aca05ec6e91ae7597bc2f87247359 Mon Sep 17 00:00:00 2001 From: Henri Binsztok <808274+hbbio@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:55:15 +0800 Subject: [PATCH 2/2] pointers: test update from pointer --- src/pointers.test.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/pointers.test.ts b/src/pointers.test.ts index 30bdbe5..435774c 100644 --- a/src/pointers.test.ts +++ b/src/pointers.test.ts @@ -318,3 +318,12 @@ test("get pointer chain", async () => { const m2 = m.map((v) => delayed(m, 20)); await expect(m2.get()).resolves.toBe(2); }); + +test("update from pointer", async () => { + const proxy = new Sheet().newProxy(); + const v = proxy.new(1); + const p = proxy.new(v); + p.update((x) => x + 1); + await expect(v.get()).resolves.toBe(2); + await expect(p.get()).resolves.toBe(2); +});