diff --git a/src/abstract.ts b/src/abstract.ts new file mode 100644 index 0000000..ee9dc5e --- /dev/null +++ b/src/abstract.ts @@ -0,0 +1,8 @@ +import { Opaque } from "type-fest" + + +export type AbstractTag = "@thilawyn/traitify-ts/Abstract" + +export function abstract() { + return {} as Opaque +} diff --git a/src/expresses.ts b/src/expresses.ts index ecdcf4e..5b67030 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -1,9 +1,19 @@ import { Call, Pipe, Tuples } from "hotscript" -import { AbstractClass, Opaque } from "type-fest" -import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitImplClassFn, TraitImplInstanceFn } from "." +import { AbstractClass, Class, Opaque } from "type-fest" +import { AbstractTag, Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitImplClassFn, TraitImplInstanceFn } from "." 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, Traits extends Trait[], @@ -40,6 +50,22 @@ class TraitExpression< this.superclass as Opaque, ) as any } + + subtrait< + SubtraitAbstract extends object, + SubtraitImpl extends Class, + >( + abstract: ( + abstract: Pipe, + SimplifyFn, + ]> + ) => Opaque, + + // impl: () + ) { + + } } export type Implements> = ( diff --git a/src/index.ts b/src/index.ts index ae86066..b839462 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ +export * from "./abstract" export * from "./expresses" export * from "./trait"