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: {