From 2fa71aaf37dafc0fb63dd22cba1cc3f53b379c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 17 Feb 2024 05:13:38 +0100 Subject: [PATCH] TraitBuilder work --- src/TraitBuilder.ts | 58 ++++++++++++++++++++++----------------------- src/tests.ts | 52 ++++++++++------------------------------ 2 files changed, 40 insertions(+), 70 deletions(-) diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index a576ecd..5f1d124 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -1,42 +1,40 @@ -import { Pipe, Tuples } from "hotscript" -import { AbstractClass, Class } from "type-fest" +import { AbstractClass, Class, Simplify } from "type-fest" import { Trait, TraitClass, TraitConcreteClass } from "./Trait" import { TraitExpression } from "./TraitExpression" -import { ExtendFn, ExtendPlain, SimplifyFn, StaticMembers } from "./util" +import { ExtendPlain, StaticMembers } from "./util" -export type ExtendAbstractSuper< - SuperExpression extends TraitExpression< - typeof TraitExpression.NullSuperclass, - Trait[] - >, - Abstract extends object, -> = ( - Pipe, - Tuples.Append, - ExtendFn, - SimplifyFn, - ]> - // ExtendPlain<[ - // ...Trait.OwnAbstract< - // TraitExpression.Traits[number] - // >, - // Abstract, - // ]> +type ExtendAbstractSuper = ( + Simplify< + ExtendPlain<[ + ...MapTraitsToOwnAbstract< + TraitExpression.Traits + >, + Abstract, + ]> + > ) +type MapTraitsToOwnAbstract = { + [K in keyof T]: Trait.OwnAbstract +} + + type ExtendStaticAbstractSuper = ( - Pipe, - Tuples.Append, - ExtendFn, - SimplifyFn, - ]> + Simplify< + ExtendPlain<[ + ...MapTraitsToOwnStaticAbstract< + TraitExpression.Traits + >, + StaticAbstract, + ]> + > ) +type MapTraitsToOwnStaticAbstract = { + [K in keyof T]: Trait.OwnStaticAbstract +} + type TraitApplierSuperTag = "@thilawyn/traitify-ts/Super" diff --git a/src/tests.ts b/src/tests.ts index eea1d3a..776bf46 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,25 +1,7 @@ -import { Trait, TraitClass } from "./Trait" +import { TraitClass } from "./Trait" import { trait } from "./TraitBuilder" -import { Implements, ImplementsStatic, TraitExpression } from "./TraitExpression" +import { Implements, ImplementsStatic } from "./TraitExpression" import { expression } from "./TraitExpressionBuilder" -import { ExtendPlain } from "./util" - - -type ExtendAbstractSuper< - SuperExpression extends TraitExpression< - typeof TraitExpression.NullSuperclass, - Trait[] - >, - Abstract extends object, -> = ( - // ExtendPlain<[ - // ...Trait.OwnAbstract< - // TraitExpression.Traits[number] - // >, - // Abstract, - // ]> - TraitExpression.Traits[number] -) const PrintsHelloOnNew = trait @@ -53,7 +35,7 @@ const StatefulSubscription = trait // { _tag: "expired", expiredSince: Date } // ) // }>() - .extendAbstract(Super => class extends Super { + .extendAbstract(Super => class StatefulSubscriptionAbstract extends Super { readonly isStatefulSubscription!: true readonly status!: ( { _tag: "awaitingPayment" } | @@ -66,7 +48,7 @@ const StatefulSubscription = trait type StatefulSubscriptionClass = TraitClass const ActiveStatefulSubscription = expression - .expresses(PrintsHelloOnNew, StatefulSubscription) + .expresses(StatefulSubscription) .build() .subtrait() .extendAbstract(Super => class extends Super { @@ -76,11 +58,6 @@ const ActiveStatefulSubscription = expression .build() type ActiveStatefulSubscriptionClass = TraitClass -type Test = ExtendAbstractSuper< - Trait.OwnSuperExpression, - Trait.OwnAbstract -> - class TestSuperclass { // id: number = 69 @@ -111,18 +88,13 @@ class User extends exp.extends implements Implements { console.log(new User()) -// class Test1 { -// prop1: string = "ouient" -// prop2: bigint = 1n -// } +type MyTuple = [ + { values: { gneugneu: string } }, + { values: { ataoy: "issou" } }, +] -// class Test2 extends Test1 { -// readonly prop1 = "juif" -// prop3: number = 69 -// } +type MapToValues = { + [K in keyof T]: T[K]["values"] +} -// type PureKeys = { -// [K in keyof T]: K extends keyof U ? T[K] extends U[K] ? never : K : K; -// }[keyof T] - -// type T = PureKeys +type T = MapToValues