From 29148cd42b29a7b6d945bb320c27160a54daad67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 2 Feb 2024 05:10:28 +0100 Subject: [PATCH] Refactoring --- src/expresses.ts | 64 +++++++++++++++++++++++++++++++++--------------- src/tests.ts | 32 +++++++++++++----------- 2 files changed, 62 insertions(+), 34 deletions(-) diff --git a/src/expresses.ts b/src/expresses.ts index ef25033..429629c 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -13,8 +13,8 @@ class TraitExpression< readonly traits: Traits, ) {} - then(fn: (e: this) => V): V { - return fn(this) + get implements() { + return {} } extends(): ( @@ -57,6 +57,44 @@ export type Implements> = ( ) +class TraitExpressionBuilder< + Super extends AbstractClass, + Traits extends readonly Trait[], +> { + constructor(public expression: TraitExpression) {} + + extends< + NewSuper extends AbstractClass + >(superclass: NewSuper) { + return new TraitExpressionBuilder( + new TraitExpression( + superclass, + this.expression.traits, + ) + ) + } + + expresses< + AppendTraits extends readonly Trait[] + >(...traits: AppendTraits) { + return new TraitExpressionBuilder( + new TraitExpression( + this.expression.superclass, + [...this.expression.traits, ...traits] as const, + ) + ) + } + + get() { + return this.expression as GetTraitExpression + } + + then(fn: (expression: typeof this.expression) => V): V { + return fn(this.expression) + } +} + + type AbstractMembersExtendable< Super extends AbstractClass, Traits extends readonly Trait[], @@ -90,8 +128,7 @@ type ImplStaticMembersExtendable< ]> ) - -type ExtendsAndExpressesReturnType< +type GetTraitExpression< Super extends AbstractClass, Traits extends readonly Trait[], > = ( @@ -106,22 +143,9 @@ type ExtendsAndExpressesReturnType< : TraitExpression ) -export function extendsAndExpresses< - Super extends AbstractClass, - Traits extends readonly Trait[], ->( - superclass: Super, - ...traits: Traits -): ExtendsAndExpressesReturnType { - return new TraitExpression(superclass, traits) as any -} class DefaultSuperclass {} -export function expresses< - Traits extends readonly Trait[], ->( - ...traits: Traits -): ExtendsAndExpressesReturnType { - return new TraitExpression(DefaultSuperclass, traits) as any -} +export const expression = new TraitExpressionBuilder( + new TraitExpression(DefaultSuperclass, [] as const) +) diff --git a/src/tests.ts b/src/tests.ts index 597685e..cd7e8a7 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,4 +1,4 @@ -import { Implements, TraitAbstractMembers, extendsAndExpresses, trait } from "." +import { Implements, TraitAbstractMembers, expression, trait } from "." const PrintsHelloOnNew = trait()(Super => @@ -44,21 +44,25 @@ const ActiveStatefulSubscription = trait(), - // Identifiable() -).then(e => - class User - extends e.extends() - implements Implements { - id: bigint = -1n - } -) +const builder = expression + .extends(TestSuperclass) + .expresses( + // PrintsHelloOnNew, + Identifiable(), + // Identifiable(), + ) + +type Impl = Implements + + +const exp = builder.get() + +class User extends exp.extends() implements (typeof exp.implements) { + // id: bigint = -1n +} console.log(new User())