diff --git a/src/expresses.ts b/src/expresses.ts index 5b9ed22..c66c0b9 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -1,7 +1,7 @@ -import { Call, Pipe, Tuples } from "hotscript" +import { Call, ComposeLeft, Pipe, Tuples } from "hotscript" import { AbstractClass, Opaque } from "type-fest" -import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitClassFn, TraitImplClassFn, TraitImplInstanceFn, TraitInstanceFn } from "." -import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util" +import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitImplClassFn, TraitImplInstanceFn } from "." +import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembers, StaticMembersFn } from "./util" class TraitExpression< @@ -42,33 +42,6 @@ class TraitExpression< } } -type TraitExpressionOutput> = ( - Exp extends TraitExpression - ? ( - AbstractClass< - Pipe<[ - InstanceType, - ...Call, Traits>, - ], [ - ExtendFn, - SimplifyFn, - ]>, - - ConstructorParameters - > & - - Pipe<[ - Super, - ...Call, Traits>, - ], [ - Tuples.Map, - ExtendFn, - SimplifyFn, - ]> - ) - : never -) - export type Implements> = ( Exp extends TraitExpression ? Pipe> = ( ) +type AbstractMembersExtendable< + Super extends AbstractClass, + Traits extends readonly Trait[], +> = ( + Call, + ...Call, Traits>, + ]> +) + +type ImplInstanceExtendable< + Super extends AbstractClass, + Traits extends readonly Trait[], +> = ( + Call, + ...Call, Traits>, + ]> +) + +type ImplStaticMembersExtendable< + Super extends AbstractClass, + Traits extends readonly Trait[], +> = ( + Call, + ...Call< + Tuples.Map< + ComposeLeft<[TraitImplClassFn, StaticMembersFn]> + >, + Traits + >, + ]> +) + + +type ExtendsAndExpressesReturnType< + Super extends AbstractClass, + Traits extends readonly Trait[], +> = ( + AbstractMembersExtendable extends true ? + ImplInstanceExtendable extends true ? + ImplStaticMembersExtendable extends true ? + TraitExpression + : "Type conflict between the traits implementation static members and/or the superclass static members." + : "Type conflict between the traits implementation instances and/or the superclass instance." + : "Type conflict between the traits abstract members and/or the superclass instance." +) + export function extendsAndExpresses< Super extends AbstractClass, Traits extends readonly Trait[], >( superclass: Super, ...traits: Traits -) { - return new TraitExpression(superclass, traits) +): ExtendsAndExpressesReturnType { + return new TraitExpression(superclass, traits) as any } class DefaultSuperclass {} @@ -96,6 +118,6 @@ export function expresses< Traits extends readonly Trait[], >( ...traits: Traits -) { - return new TraitExpression(DefaultSuperclass, traits) +): ExtendsAndExpressesReturnType { + return new TraitExpression(DefaultSuperclass, traits) as any } diff --git a/src/tests.ts b/src/tests.ts index b5ca906..2555515 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,6 +1,4 @@ -import { Booleans, Call, Compose, ComposeLeft, Match, Pipe, Tuples } from "hotscript" -import { Implements, TraitAbstractMembers, TraitAbstractMembersFn, expresses, extendsAndExpresses, trait } from "." -import { CheckExtendableFn, ExtendFn, Extendable, ExtendableFn, SimplifyFn } from "./util" +import { Implements, TraitAbstractMembers, extendsAndExpresses, trait } from "." const PrintsHelloOnNew = trait()(Super => @@ -45,7 +43,8 @@ const ActiveStatefulSubscription = trait(), // Identifiable() ) -type ExpImpl = Implements -type ExpAbstractMembers = Pipe, -]> -type ExpExtendable = Extendable +// type ExpImpl = ImplStaticMembersExtendable class User extends exp.extends() implements Implements { id: bigint = -1n diff --git a/src/trait.ts b/src/trait.ts index a8b758e..df897c3 100644 --- a/src/trait.ts +++ b/src/trait.ts @@ -3,16 +3,16 @@ import { AbstractClass, Class, Opaque } from "type-fest" import { StaticMembers } from "./util" -type AddAbstractMembersToImpl< - Impl extends Class, - AbstractMembers extends object, -> = ( - Class< - InstanceType & AbstractMembers, - ConstructorParameters - > & - StaticMembers -) +// type AddAbstractMembersToImpl< +// Impl extends Class, +// AbstractMembers extends object, +// > = ( +// Class< +// InstanceType & AbstractMembers, +// ConstructorParameters +// > & +// StaticMembers +// ) type RemoveAbstractMembersFromImplInstance< ImplInstanceWithAbstractMembers extends AbstractMembers, @@ -21,7 +21,7 @@ type RemoveAbstractMembersFromImplInstance< Omit ) -type RemoveAbstractMembersFromImpl< +type RemoveAbstractMembersFromImplClass< ImplWithAbstractMembers extends Class, AbstractMembers extends object, > = ( @@ -63,7 +63,7 @@ export interface TraitAbstractMembersFn extends Fn { export type TraitImplClass = ( T extends Trait - ? RemoveAbstractMembersFromImpl< + ? RemoveAbstractMembersFromImplClass< ImplWithAbstractMembers, AbstractMembers >