From 77abffc8ff8f5c32811a446192b87f1341ec178b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Jul 2025 21:55:19 +0200 Subject: [PATCH] Memo refactoring --- packages/effect-fc/src/Component.ts | 35 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index 280cad0..1052e49 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -340,28 +340,27 @@ export namespace Memoized { } } -export const memo = >( - self: ExcludeKeys>> -): T & Memoized> => Object.setPrototypeOf( - { ...self, memo: true, memoOptions: {} }, - Object.getPrototypeOf(self), -) +export const memo = | Component & Memoized>( + self: T +): T & Memoized> => Object.setPrototypeOf({ + ...self, + memo: true, + memoOptions: Predicate.hasProperty(self, "memo") ? { ...self.memoOptions } : {}, +}, Object.getPrototypeOf(self)) -export const memoWithOptions: { - >( +export const withMemoOptions: { + & Memoized>( memoOptions: Partial>> - ): ( - self: ExcludeKeys>> - ) => T & Memoized> - >( - self: ExcludeKeys>>, + ): (self: T) => T + & Memoized>( + self: T, memoOptions: Partial>>, - ): T & Memoized> -} = Function.dual(2, >( - self: ExcludeKeys>>, + ): T +} = Function.dual(2, & Memoized>( + self: T, memoOptions: Partial>>, -): T & Memoized> => Object.setPrototypeOf( - { ...self, memo: true, memoOptions }, +): T => Object.setPrototypeOf( + { ...self, memoOptions: { ...self.memoOptions, ...memoOptions } }, Object.getPrototypeOf(self), ))