TraitExpressionTraitsFn
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Julien Valverdé
2024-02-04 02:22:35 +01:00
parent 1219cd7a89
commit ec914e0ffd
3 changed files with 74 additions and 20 deletions

View File

@@ -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)