This commit is contained in:
@@ -4,18 +4,8 @@ import { AbstractTag, Trait, TraitAbstractMembersFn, TraitApplierSuperTag, Trait
|
||||
import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util"
|
||||
|
||||
|
||||
type SubtraitApplier<
|
||||
Traits extends Trait<any, any>[],
|
||||
Abstract extends object,
|
||||
ImplWithAbstract extends Class<Abstract, []>,
|
||||
> = (
|
||||
(Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
|
||||
Opaque<ImplWithAbstract, TraitApplierSuperTag>
|
||||
)
|
||||
)
|
||||
|
||||
class TraitExpression<
|
||||
Super extends AbstractClass<any>,
|
||||
Super extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any>[],
|
||||
> {
|
||||
constructor(
|
||||
@@ -52,8 +42,8 @@ class TraitExpression<
|
||||
}
|
||||
|
||||
subtrait<
|
||||
SubtraitAbstract extends object,
|
||||
SubtraitImplWithAbstract extends Class<any>,
|
||||
SubtraitAbstract extends {},
|
||||
SubtraitImplWithAbstract extends Class<{}>,
|
||||
>(
|
||||
abstract: (
|
||||
abstract: Pipe<Traits, [
|
||||
@@ -80,7 +70,7 @@ export type Implements<Exp extends TraitExpression<any, any>> = (
|
||||
|
||||
|
||||
class TraitExpressionBuilder<
|
||||
Super extends AbstractClass<any>,
|
||||
Super extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any>[],
|
||||
> {
|
||||
constructor(public expression: TraitExpression<Super, Traits>) {}
|
||||
@@ -118,7 +108,7 @@ class TraitExpressionBuilder<
|
||||
|
||||
|
||||
type AbstractMembersExtendable<
|
||||
Super extends AbstractClass<any>,
|
||||
Super extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Call<ExtendableFn, [
|
||||
@@ -128,7 +118,7 @@ type AbstractMembersExtendable<
|
||||
)
|
||||
|
||||
type ImplInstanceExtendable<
|
||||
Super extends AbstractClass<any>,
|
||||
Super extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Call<ExtendableFn, [
|
||||
@@ -138,7 +128,7 @@ type ImplInstanceExtendable<
|
||||
)
|
||||
|
||||
type ImplStaticMembersExtendable<
|
||||
Super extends AbstractClass<any>,
|
||||
Super extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Pipe<[
|
||||
@@ -151,7 +141,7 @@ type ImplStaticMembersExtendable<
|
||||
)
|
||||
|
||||
type GetTraitExpression<
|
||||
Super extends AbstractClass<any>,
|
||||
Super extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Call<Tuples.IsEmpty, Traits> extends true
|
||||
|
||||
53
src/trait.ts
53
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<Impl, Abstract>
|
||||
// >
|
||||
// }, TraitTag>
|
||||
// )
|
||||
|
||||
export class Trait<
|
||||
Abstract extends {},
|
||||
Impl extends Class<{}, []>,
|
||||
> = (
|
||||
Opaque<{
|
||||
readonly apply: TraitApplier<
|
||||
Abstract,
|
||||
AddAbstractToImpl<Impl, Abstract>
|
||||
>
|
||||
}, TraitTag>
|
||||
)
|
||||
> {
|
||||
constructor(
|
||||
readonly abstract: Abstract,
|
||||
readonly apply: (Super: AbstractClass<{}>) => Impl,
|
||||
) {}
|
||||
}
|
||||
|
||||
export type TraitAbstractMembers<T> = (
|
||||
T extends Trait<infer AbstractMembers, any>
|
||||
@@ -96,24 +106,17 @@ export interface TraitInstanceFn extends Fn {
|
||||
|
||||
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"
|
||||
|
||||
export type TraitApplier<
|
||||
Abstract extends {},
|
||||
ImplWithAbstract extends Class<Abstract, []>,
|
||||
> = (
|
||||
(Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
|
||||
Opaque<ImplWithAbstract, TraitApplierSuperTag>
|
||||
)
|
||||
)
|
||||
|
||||
export function trait<
|
||||
Abstract extends {},
|
||||
ImplWithAbstract extends Class<Abstract, []>,
|
||||
>(
|
||||
abstract: Opaque<Abstract, AbstractTag>,
|
||||
apply: TraitApplier<Abstract, ImplWithAbstract>,
|
||||
): Trait<
|
||||
Abstract,
|
||||
RemoveAbstractFromImpl<ImplWithAbstract, Abstract>
|
||||
> {
|
||||
return { apply } as any
|
||||
apply: (Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
|
||||
Opaque<ImplWithAbstract, TraitApplierSuperTag>
|
||||
),
|
||||
) {
|
||||
return new Trait(
|
||||
abstract as Abstract,
|
||||
apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImpl<ImplWithAbstract, Abstract>,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user