This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
import { Call, Pipe, Tuples } from "hotscript"
|
||||
import { Call, Fn, Pipe, Tuples } from "hotscript"
|
||||
import { AbstractClass, Class, Opaque } from "type-fest"
|
||||
import { AbstractTag, Trait, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn } from "."
|
||||
import { AbstractTag, Trait, TraitAbstractFn, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, TraitSupertraitsFn } from "."
|
||||
import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util"
|
||||
|
||||
|
||||
export class TraitExpressionNullSuperclass {}
|
||||
|
||||
export class TraitExpression<
|
||||
Super extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any, any>[],
|
||||
@@ -58,6 +60,46 @@ export class TraitExpression<
|
||||
}
|
||||
}
|
||||
|
||||
export const emptyTraitExpression = new TraitExpression(TraitExpressionNullSuperclass, [] as const)
|
||||
|
||||
interface PrependTraitSupertraitsFn extends Fn {
|
||||
return: [
|
||||
...Call<TraitSupertraitsFn, this["arg0"]>,
|
||||
this["arg0"],
|
||||
]
|
||||
}
|
||||
export interface TraitExpressionTraitsFn extends Fn {
|
||||
return: this["arg0"] extends TraitExpression<any, infer Traits>
|
||||
? Call<Tuples.FlatMap<PrependTraitSupertraitsFn>, Traits>
|
||||
: never
|
||||
}
|
||||
|
||||
export interface TraitExpressionAbstractFn extends Fn {
|
||||
return: this["arg0"] extends TraitExpression<any, infer Traits>
|
||||
? Pipe<Traits, [
|
||||
TraitAbstractFn,
|
||||
ExtendFn,
|
||||
]>
|
||||
: never
|
||||
}
|
||||
|
||||
export interface TraitExpressionInstanceFn extends Fn {
|
||||
return: this["arg0"] extends TraitExpression<infer Super, infer Traits>
|
||||
? Pipe<Traits, [
|
||||
TraitAbstractFn,
|
||||
ExtendFn,
|
||||
]>
|
||||
: never
|
||||
}
|
||||
|
||||
export interface TraitExpressionStaticFn extends Fn {
|
||||
return: this["arg0"] extends TraitExpression<infer Super, infer Traits>
|
||||
? Pipe<Traits, [
|
||||
TraitAbstractFn,
|
||||
ExtendFn,
|
||||
]>
|
||||
: never
|
||||
}
|
||||
|
||||
|
||||
export type Implements<Exp extends TraitExpression<any, any>> = (
|
||||
@@ -158,8 +200,4 @@ type GetTraitExpression<
|
||||
)
|
||||
|
||||
|
||||
export class NullTraitExpressionSuperclass {}
|
||||
|
||||
export const expression = new TraitExpressionBuilder(
|
||||
new TraitExpression(NullTraitExpressionSuperclass, [] as const)
|
||||
)
|
||||
export const expression = new TraitExpressionBuilder(emptyTraitExpression)
|
||||
|
||||
Reference in New Issue
Block a user