useSubRefFromGetSet
All checks were successful
Lint / lint (push) Successful in 14s

This commit is contained in:
Julien Valverdé
2025-04-21 01:21:59 +02:00
parent 926482b154
commit eabcf9085b
2 changed files with 15 additions and 5 deletions

View File

@@ -3,8 +3,6 @@ import { Button, Flex, Text } from "@radix-ui/themes"
import { createFileRoute } from "@tanstack/react-router" import { createFileRoute } from "@tanstack/react-router"
import { GetRandomValues, makeUuid4 } from "@typed/id" import { GetRandomValues, makeUuid4 } from "@typed/id"
import { Console, Effect, Ref } from "effect" import { Console, Effect, Ref } from "effect"
import { useMemo } from "react"
import { SubscriptionSubRef } from "reffuse/types"
export const Route = createFileRoute("/tests")({ export const Route = createFileRoute("/tests")({
@@ -13,11 +11,11 @@ export const Route = createFileRoute("/tests")({
function RouteComponent() { function RouteComponent() {
const deepRef = R.useRef({ value: "poulet" }) const deepRef = R.useRef({ value: "poulet" })
const deepValueRef = useMemo(() => SubscriptionSubRef.makeFromGetSet( const deepValueRef = R.useSubRefFromGetSet(
deepRef, deepRef,
b => b.value, b => b.value,
(b, a) => ({ ...b, value: a }), (b, a) => ({ ...b, value: a }),
), [deepRef]) )
// const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe(
// Effect.andThen(makeUuid4), // Effect.andThen(makeUuid4),

View File

@@ -2,7 +2,7 @@ import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer,
import * as React from "react" import * as React from "react"
import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseContext from "./ReffuseContext.js"
import * as ReffuseRuntime from "./ReffuseRuntime.js" import * as ReffuseRuntime from "./ReffuseRuntime.js"
import { SetStateAction } from "./types/index.js" import { SetStateAction, SubscriptionSubRef } from "./types/index.js"
export interface RenderOptions { export interface RenderOptions {
@@ -384,6 +384,18 @@ export abstract class ReffuseNamespace<R> {
) )
} }
useSubRefFromGetSet<A, B, R>(
this: ReffuseNamespace<R>,
parent: SubscriptionRef.SubscriptionRef<B>,
getter: (parentValue: B) => A,
setter: (parentValue: B, value: A) => B,
): SubscriptionSubRef.SubscriptionSubRef<A, B> {
return React.useMemo(
() => SubscriptionSubRef.makeFromGetSet(parent, getter, setter),
[parent],
)
}
useSubscribeRefs< useSubscribeRefs<
const Refs extends readonly SubscriptionRef.SubscriptionRef<any>[], const Refs extends readonly SubscriptionRef.SubscriptionRef<any>[],
R, R,