From eabcf9085b28fdadb2a2cff80fd60c8272a59c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 01:21:59 +0200 Subject: [PATCH] useSubRefFromGetSet --- packages/example/src/routes/tests.tsx | 6 ++---- packages/reffuse/src/ReffuseNamespace.ts | 14 +++++++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 55faa45..def5d5c 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -3,8 +3,6 @@ import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect, Ref } from "effect" -import { useMemo } from "react" -import { SubscriptionSubRef } from "reffuse/types" export const Route = createFileRoute("/tests")({ @@ -13,11 +11,11 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const deepRef = R.useRef({ value: "poulet" }) - const deepValueRef = useMemo(() => SubscriptionSubRef.makeFromGetSet( + const deepValueRef = R.useSubRefFromGetSet( deepRef, b => b.value, (b, a) => ({ ...b, value: a }), - ), [deepRef]) + ) // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( // Effect.andThen(makeUuid4), diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index f4d6c06..1ad1d10 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -2,7 +2,7 @@ import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -import { SetStateAction } from "./types/index.js" +import { SetStateAction, SubscriptionSubRef } from "./types/index.js" export interface RenderOptions { @@ -384,6 +384,18 @@ export abstract class ReffuseNamespace { ) } + useSubRefFromGetSet( + this: ReffuseNamespace, + parent: SubscriptionRef.SubscriptionRef, + getter: (parentValue: B) => A, + setter: (parentValue: B, value: A) => B, + ): SubscriptionSubRef.SubscriptionSubRef { + return React.useMemo( + () => SubscriptionSubRef.makeFromGetSet(parent, getter, setter), + [parent], + ) + } + useSubscribeRefs< const Refs extends readonly SubscriptionRef.SubscriptionRef[], R,