From b6a127c8a79ee5997843b237265870baec9d0c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 18 May 2025 12:35:44 +0200 Subject: [PATCH] SubRefFromGetSet --- packages/reffuse/src/ReffuseNamespace.ts | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 53d94c9..f074e38 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -27,6 +27,7 @@ export abstract class ReffuseNamespace { declare ["constructor"]: ReffuseNamespaceClass constructor() { + this.useSubRefFromGetSet = this.useSubRefFromGetSet.bind(this as any) as any this.SubRefFromPath = this.SubRefFromPath.bind(this as any) as any this.SubscribeRefs = this.SubscribeRefs.bind(this as any) as any this.RefState = this.RefState.bind(this as any) as any @@ -404,6 +405,18 @@ export abstract class ReffuseNamespace { return ref } + 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], + ) + } + useSubRefFromPath, R>( this: ReffuseNamespace, parent: SubscriptionRef.SubscriptionRef, @@ -528,6 +541,18 @@ export abstract class ReffuseNamespace { } + SubRefFromGetSet( + this: ReffuseNamespace, + props: { + readonly parent: SubscriptionRef.SubscriptionRef, + readonly getter: (parentValue: B) => A, + readonly setter: (parentValue: B, value: A) => B, + readonly children: (subRef: SubscriptionSubRef.SubscriptionSubRef) => React.ReactNode + }, + ): React.ReactNode { + return props.children(this.useSubRefFromGetSet(props.parent, props.getter, props.setter)) + } + SubRefFromPath, R>( this: ReffuseNamespace, props: {