This commit is contained in:
59
src/Trait.ts
59
src/Trait.ts
@@ -1,7 +1,6 @@
|
|||||||
import { Fn } from "hotscript"
|
|
||||||
import { AbstractClass, Class, Simplify } from "type-fest"
|
import { AbstractClass, Class, Simplify } from "type-fest"
|
||||||
import { TraitExpression } from "./TraitExpression"
|
import { TraitExpression } from "./TraitExpression"
|
||||||
import { Extend, ExtendPlain, StaticMembers } from "./util"
|
import { ExtendPlain, StaticMembers } from "./util"
|
||||||
|
|
||||||
|
|
||||||
export class Trait<
|
export class Trait<
|
||||||
@@ -22,90 +21,72 @@ export class Trait<
|
|||||||
}
|
}
|
||||||
|
|
||||||
export namespace Trait {
|
export namespace Trait {
|
||||||
export type OwnSuperExpression<T> = (
|
export type SuperExpression<T> = (
|
||||||
T extends Trait<infer SuperExpression, any, any, any>
|
T extends Trait<infer SuperExpression, any, any, any>
|
||||||
? SuperExpression
|
? SuperExpression
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
export interface OwnSuperExpressionFn extends Fn {
|
|
||||||
return: Trait.OwnSuperExpression<this["arg0"]>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type OwnAbstract<T> = (
|
export type Abstract<T> = (
|
||||||
T extends Trait<any, infer Abstract, any, any>
|
T extends Trait<any, infer Abstract, any, any>
|
||||||
? Abstract
|
? Abstract
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
export interface OwnAbstractFn extends Fn {
|
|
||||||
return: Trait.OwnAbstract<this["arg0"]>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type OwnStaticAbstract<T> = (
|
export type StaticAbstract<T> = (
|
||||||
T extends Trait<any, any, infer StaticAbstract, any>
|
T extends Trait<any, any, infer StaticAbstract, any>
|
||||||
? StaticAbstract
|
? StaticAbstract
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
export interface OwnStaticAbstractFn extends Fn {
|
|
||||||
return: Trait.OwnStaticAbstract<this["arg0"]>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type OwnImplClass<T> = (
|
export type ImplClass<T> = (
|
||||||
T extends Trait<any, any, any, infer ImplClass>
|
T extends Trait<any, any, any, infer ImplClass>
|
||||||
? ImplClass
|
? ImplClass
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
export interface OwnImplClassFn extends Fn {
|
|
||||||
return: Trait.OwnImplClass<this["arg0"]>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type OwnImplInstance<T> = (
|
export type ImplInstance<T> = (
|
||||||
InstanceType<Trait.OwnImplClass<T>>
|
InstanceType<Trait.ImplClass<T>>
|
||||||
)
|
)
|
||||||
export interface OwnImplInstanceFn extends Fn {
|
|
||||||
return: Trait.OwnImplInstance<this["arg0"]>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type OwnImplStaticMembers<T> = (
|
export type ImplStaticMembers<T> = (
|
||||||
StaticMembers<Trait.OwnImplClass<T>>
|
StaticMembers<Trait.ImplClass<T>>
|
||||||
)
|
)
|
||||||
|
|
||||||
export type Supertraits<T> = (
|
export type Supertraits<T> = (
|
||||||
TraitExpression.Traits<Trait.OwnSuperExpression<T>>
|
TraitExpression.Traits<Trait.SuperExpression<T>>
|
||||||
)
|
)
|
||||||
export interface SupertraitsFn extends Fn {
|
|
||||||
return: Trait.Supertraits<this["arg0"]>
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export namespace Traits {
|
export namespace TraitTuple {
|
||||||
export type MapAbstract<T> = {
|
export type MapAbstract<T> = {
|
||||||
[K in keyof T]: K extends keyof []
|
[K in keyof T]: K extends keyof []
|
||||||
? T[K]
|
? T[K]
|
||||||
: Trait.OwnAbstract<T[K]>
|
: Trait.Abstract<T[K]>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MapStaticAbstract<T> = {
|
export type MapStaticAbstract<T> = {
|
||||||
[K in keyof T]: K extends keyof []
|
[K in keyof T]: K extends keyof []
|
||||||
? T[K]
|
? T[K]
|
||||||
: Trait.OwnStaticAbstract<T[K]>
|
: Trait.StaticAbstract<T[K]>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MapImplClass<T> = {
|
export type MapImplClass<T> = {
|
||||||
[K in keyof T]: K extends keyof []
|
[K in keyof T]: K extends keyof []
|
||||||
? T[K]
|
? T[K]
|
||||||
: Trait.OwnImplClass<T[K]>
|
: Trait.ImplClass<T[K]>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MapImplInstance<T> = {
|
export type MapImplInstance<T> = {
|
||||||
[K in keyof T]: K extends keyof []
|
[K in keyof T]: K extends keyof []
|
||||||
? T[K]
|
? T[K]
|
||||||
: Trait.OwnImplInstance<T[K]>
|
: Trait.ImplInstance<T[K]>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MapImplStaticMembers<T> = {
|
export type MapImplStaticMembers<T> = {
|
||||||
[K in keyof T]: K extends keyof []
|
[K in keyof T]: K extends keyof []
|
||||||
? T[K]
|
? T[K]
|
||||||
: Trait.OwnImplStaticMembers<T[K]>
|
: Trait.ImplStaticMembers<T[K]>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,8 +104,8 @@ export type TraitConcreteClass<T extends Trait<any, any, any, any>> = (
|
|||||||
export type TraitInstance<T extends Trait<any, any, any, any>> = (
|
export type TraitInstance<T extends Trait<any, any, any, any>> = (
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<[
|
ExtendPlain<[
|
||||||
Trait.OwnAbstract<T>,
|
Trait.Abstract<T>,
|
||||||
Trait.OwnImplInstance<T>,
|
Trait.ImplInstance<T>,
|
||||||
]>
|
]>
|
||||||
>
|
>
|
||||||
)
|
)
|
||||||
@@ -132,8 +113,8 @@ export type TraitInstance<T extends Trait<any, any, any, any>> = (
|
|||||||
export type TraitStaticMembers<T extends Trait<any, any, any, any>> = (
|
export type TraitStaticMembers<T extends Trait<any, any, any, any>> = (
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<[
|
ExtendPlain<[
|
||||||
Trait.OwnStaticAbstract<T>,
|
Trait.StaticAbstract<T>,
|
||||||
StaticMembers<Trait.OwnImplClass<T>>,
|
Trait.ImplStaticMembers<T>,
|
||||||
]>
|
]>
|
||||||
>
|
>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
import { AbstractClass, Class, Simplify } from "type-fest"
|
import { AbstractClass, Class, Simplify } from "type-fest"
|
||||||
import { Trait, TraitInstance, TraitStaticMembers, Traits } from "./Trait"
|
import { Trait, TraitInstance, TraitStaticMembers, TraitTuple } from "./Trait"
|
||||||
import { TraitBuilder } from "./TraitBuilder"
|
import { TraitBuilder } from "./TraitBuilder"
|
||||||
import { ExtendPlain, StaticMembers } from "./util"
|
import { ExtendPlain, StaticMembers } from "./util"
|
||||||
|
|
||||||
|
|
||||||
export class TraitExpression<
|
export class TraitExpression<
|
||||||
Superclass extends AbstractClass<object>,
|
Superclass extends AbstractClass<object>,
|
||||||
const T extends Trait<any, any, any, any>[],
|
const Traits extends Trait<any, any, any, any>[],
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
readonly superclass: Superclass,
|
readonly superclass: Superclass,
|
||||||
readonly traits: T,
|
readonly traits: Traits,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
get extends(): (
|
get extends(): (
|
||||||
@@ -18,7 +18,7 @@ export class TraitExpression<
|
|||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<[
|
ExtendPlain<[
|
||||||
InstanceType<Superclass>,
|
InstanceType<Superclass>,
|
||||||
...Traits.MapImplInstance<T>,
|
...TraitTuple.MapImplInstance<Traits>,
|
||||||
]>
|
]>
|
||||||
>,
|
>,
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ export class TraitExpression<
|
|||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<[
|
ExtendPlain<[
|
||||||
StaticMembers<Superclass>,
|
StaticMembers<Superclass>,
|
||||||
...Traits.MapImplStaticMembers<T>,
|
...TraitTuple.MapImplStaticMembers<Traits>,
|
||||||
]>
|
]>
|
||||||
>
|
>
|
||||||
) {
|
) {
|
||||||
@@ -49,19 +49,19 @@ export class TraitExpression<
|
|||||||
This,
|
This,
|
||||||
|
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<Traits.MapAbstract<T>>
|
ExtendPlain<TraitTuple.MapAbstract<Traits>>
|
||||||
>,
|
>,
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<Traits.MapStaticAbstract<T>>
|
ExtendPlain<TraitTuple.MapStaticAbstract<Traits>>
|
||||||
>,
|
>,
|
||||||
|
|
||||||
AbstractClass<
|
AbstractClass<
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<Traits.MapImplInstance<T>>
|
ExtendPlain<TraitTuple.MapImplInstance<Traits>>
|
||||||
>
|
>
|
||||||
> &
|
> &
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<Traits.MapImplStaticMembers<T>>
|
ExtendPlain<TraitTuple.MapImplStaticMembers<Traits>>
|
||||||
>
|
>
|
||||||
>(
|
>(
|
||||||
this,
|
this,
|
||||||
@@ -97,7 +97,7 @@ export type Implements<
|
|||||||
> = (
|
> = (
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<
|
ExtendPlain<
|
||||||
Traits.MapAbstract<
|
TraitTuple.MapAbstract<
|
||||||
TraitExpression.Traits<Exp>
|
TraitExpression.Traits<Exp>
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
@@ -109,7 +109,7 @@ export type ImplementsStatic<
|
|||||||
> = (
|
> = (
|
||||||
Simplify<
|
Simplify<
|
||||||
ExtendPlain<
|
ExtendPlain<
|
||||||
Traits.MapStaticAbstract<
|
TraitTuple.MapStaticAbstract<
|
||||||
TraitExpression.Traits<Exp>
|
TraitExpression.Traits<Exp>
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user