From 8252b6cbdf8ec37807e46f2cefc07c69f84cd7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Feb 2025 05:22:19 +0100 Subject: [PATCH] Extension work --- packages/reffuse/src/ReffuseExtension.ts | 28 +++++++++++++++++++----- packages/reffuse/src/types.ts | 21 ++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 packages/reffuse/src/types.ts diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 6d0648c..28987cb 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,10 +1,28 @@ -import type { Effect } from "effect" -import * as ReffuseContext from "./ReffuseContext.js" import * as Reffuse from "./Reffuse.js" -import type { Simplify } from "effect/Types" +import type { Merge, StaticType } from "./types.js" -const make = (extension: T) => - (base: R) => { +const make = (extension: Ext) => + < + BaseClass extends typeof Reffuse.Reffuse, + R, + >( + base: BaseClass & typeof Reffuse.Reffuse + ): ( + { new(): Merge, Ext> } & + StaticType + ) => { const class_ = class extends base {} + return class_ } + + +const cls = make({ + prout(this: Reffuse.Reffuse) {} +})(Reffuse.Reffuse) + +class Cls extends cls {} + +const cls2 = make({ + aya() {} +})(cls) diff --git a/packages/reffuse/src/types.ts b/packages/reffuse/src/types.ts new file mode 100644 index 0000000..51f4129 --- /dev/null +++ b/packages/reffuse/src/types.ts @@ -0,0 +1,21 @@ +/** + * Extracts the common keys between two types + */ +export type CommonKeys = Extract + +/** + * Obtain the static members type of a constructor function type + */ +export type StaticType any> = Omit + +export type Extend = + Extendable extends true + ? Omit> & Self + : never + +export type Extendable = + Pick> extends Pick> + ? true + : false + +export type Merge = Omit> & Self