diff --git a/bun.lockb b/bun.lockb index 3bf296d..c3c0b09 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/src/expresses.ts b/src/expresses.ts index d8dbe4c..fed933a 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -1,6 +1,7 @@ -import { AbstractClass, Opaque } from "type-fest" -import { Trait, TraitApplierSuperTag } from "." -import { MergeInheritanceTree, TraitsAbstractMembers } from "./util" +import { Fn, Pipe, Tuples } from "hotscript" +import { AbstractClass, Opaque, Simplify } from "type-fest" +import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag } from "." +import { ExtendFn } from "./util" class TraitsExpression< @@ -12,14 +13,6 @@ class TraitsExpression< readonly traits: Traits, ) {} - implements(): ( - MergeInheritanceTree< - TraitsAbstractMembers - > - ) { - return {} as any - } - extends() { return this.traits.reduce( (previous, trait) => trait.apply(previous), @@ -29,6 +22,21 @@ class TraitsExpression< } +interface SimplifyFn extends Fn { + return: Simplify +} + +export type Implements> = ( + Exp extends TraitsExpression + ? Pipe, + ExtendFn, + SimplifyFn, + ]> + : never +) + + export function extendsAndExpresses< Super extends AbstractClass, Traits extends readonly Trait[], diff --git a/src/tests.ts b/src/tests.ts index 39aece7..104d0fe 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,7 +1,4 @@ -import { Simplify } from "type-fest" -import { GetTraitAbstractMembers, GetTraitClass, GetTraitImplClass, GetTraitImplInstance, GetTraitInstance, Trait, TraitAbstractMembers, TraitImplInstance, expresses, trait } from "." -import { MergeInheritanceTree, TraitsAbstractMembers } from "./util" -import { Call, Fn, Tuples } from "hotscript" +import { Implements, TraitAbstractMembers, expresses, trait } from "." const PrintsHelloOnNew = trait()(Super => @@ -41,28 +38,16 @@ const ActiveStatefulSubscription = trait>>> -type Test1 = [ - TraitAbstractMembers, - TraitAbstractMembers, -] -type Test2 = TraitsAbstractMembers<[ - typeof StatefulSubscription, - typeof ActiveStatefulSubscription, -]> -type Test3 = Simplify< - Call, [ - typeof StatefulSubscription, - typeof ActiveStatefulSubscription, - ]> -> + // type Test2 = Simplify> -const appliedIdentifiable = Identifiable().apply({} as any) +const exp = expresses( + Identifiable(), + // Identifiable() +) +type Impl = Implements -const exp = expresses(Identifiable(), Identifiable()) - -class User implements ReturnType { +class User implements Implements { id: bigint = -1n } diff --git a/src/trait.ts b/src/trait.ts index a73f4d1..a8b758e 100644 --- a/src/trait.ts +++ b/src/trait.ts @@ -57,7 +57,7 @@ export type TraitAbstractMembers = ( : never ) -export interface GetTraitAbstractMembers extends Fn { +export interface TraitAbstractMembersFn extends Fn { return: TraitAbstractMembers } @@ -70,7 +70,7 @@ export type TraitImplClass = ( : never ) -export interface GetTraitImplClass extends Fn { +export interface TraitImplClassFn extends Fn { return: TraitImplClass } @@ -83,7 +83,7 @@ export type TraitImplInstance = ( : never ) -export interface GetTraitImplInstance extends Fn { +export interface TraitImplInstanceFn extends Fn { return: TraitImplInstance } @@ -93,7 +93,7 @@ export type TraitClass = ( : never ) -export interface GetTraitClass extends Fn { +export interface TraitClassFn extends Fn { return: TraitClass } @@ -103,7 +103,7 @@ export type TraitInstance = ( : never ) -export interface GetTraitInstance extends Fn { +export interface TraitInstanceFn extends Fn { return: TraitInstance } diff --git a/src/util/extend.ts b/src/util/extend.ts index e69de29..c36ae4e 100644 --- a/src/util/extend.ts +++ b/src/util/extend.ts @@ -0,0 +1,16 @@ +import { Call, Fn, Tuples } from "hotscript" + + +type CommonKeys = Extract + +type ExtendReducer = ( + Pick> extends Pick> + ? Omit> & Self + : never +) +interface ExtendReducerFn extends Fn { + return: ExtendReducer +} + +export type ExtendFn = Tuples.Reduce +export type Extend = Call diff --git a/src/util/index.ts b/src/util/index.ts index c5faea6..bf58ac1 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,3 +1,3 @@ export * from "./class" +export * from "./extend" export * from "./inheritance" -export * from "./trait" diff --git a/src/util/trait.ts b/src/util/trait.ts deleted file mode 100644 index 83153cd..0000000 --- a/src/util/trait.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Trait, TraitAbstractMembers, TraitClass } from ".." - - -export type TraitsAbstractMembers[]> = ( - Traits extends [infer T, ...infer Rest] - ? T extends Trait - ? Rest extends Trait[] - ? [TraitAbstractMembers, ...TraitsClasses] - : never - : never - : [] -) - -export type TraitsClasses[]> = ( - Traits extends [infer T, ...infer Rest] - ? T extends Trait - ? Rest extends Trait[] - ? [TraitClass, ...TraitsClasses] - : never - : never - : [] -)