diff --git a/src/expresses.ts b/src/expresses.ts index 2d715f2..785c844 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -4,18 +4,8 @@ import { AbstractTag, Trait, TraitAbstractMembersFn, TraitApplierSuperTag, Trait import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util" -type SubtraitApplier< - Traits extends Trait[], - Abstract extends object, - ImplWithAbstract extends Class, -> = ( - (Super: Opaque, TraitApplierSuperTag>) => ( - Opaque - ) -) - class TraitExpression< - Super extends AbstractClass, + Super extends AbstractClass<{}>, Traits extends Trait[], > { constructor( @@ -52,8 +42,8 @@ class TraitExpression< } subtrait< - SubtraitAbstract extends object, - SubtraitImplWithAbstract extends Class, + SubtraitAbstract extends {}, + SubtraitImplWithAbstract extends Class<{}>, >( abstract: ( abstract: Pipe> = ( class TraitExpressionBuilder< - Super extends AbstractClass, + Super extends AbstractClass<{}>, Traits extends Trait[], > { constructor(public expression: TraitExpression) {} @@ -118,7 +108,7 @@ class TraitExpressionBuilder< type AbstractMembersExtendable< - Super extends AbstractClass, + Super extends AbstractClass<{}>, Traits extends Trait[], > = ( Call, + Super extends AbstractClass<{}>, Traits extends Trait[], > = ( Call, + Super extends AbstractClass<{}>, Traits extends Trait[], > = ( Pipe<[ @@ -151,7 +141,7 @@ type ImplStaticMembersExtendable< ) type GetTraitExpression< - Super extends AbstractClass, + Super extends AbstractClass<{}>, Traits extends Trait[], > = ( Call extends true diff --git a/src/trait.ts b/src/trait.ts index 9560b83..b51ec0f 100644 --- a/src/trait.ts +++ b/src/trait.ts @@ -27,19 +27,29 @@ type RemoveAbstractFromImpl< ) -export type TraitTag = "@thilawyn/traitify-ts/Trait" +// export type TraitTag = "@thilawyn/traitify-ts/Trait" -export type Trait< +// export type Trait< +// Abstract extends {}, +// Impl extends Class<{}, []>, +// > = ( +// Opaque<{ +// readonly apply: TraitApplier< +// Abstract, +// AddAbstractToImpl +// > +// }, TraitTag> +// ) + +export class Trait< Abstract extends {}, Impl extends Class<{}, []>, -> = ( - Opaque<{ - readonly apply: TraitApplier< - Abstract, - AddAbstractToImpl - > - }, TraitTag> -) +> { + constructor( + readonly abstract: Abstract, + readonly apply: (Super: AbstractClass<{}>) => Impl, + ) {} +} export type TraitAbstractMembers = ( T extends Trait @@ -96,24 +106,17 @@ export interface TraitInstanceFn extends Fn { export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper" -export type TraitApplier< - Abstract extends {}, - ImplWithAbstract extends Class, -> = ( - (Super: Opaque, TraitApplierSuperTag>) => ( - Opaque - ) -) - export function trait< Abstract extends {}, ImplWithAbstract extends Class, >( - abstract: Opaque, - apply: TraitApplier, -): Trait< - Abstract, - RemoveAbstractFromImpl -> { - return { apply } as any + abstract: Opaque, + apply: (Super: Opaque, TraitApplierSuperTag>) => ( + Opaque + ), +) { + return new Trait( + abstract as Abstract, + apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImpl, + ) }