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,7 +1,7 @@
import { Call, Fn } from "hotscript"
import { AbstractClass, Class, Opaque } from "type-fest"
import { AbstractTag, NullTraitExpressionSuperclass, TraitExpression } from "."
import { StaticMembers } from "./util"
import { AbstractTag, TraitExpression, TraitExpressionAbstractFn, TraitExpressionNullSuperclass, TraitExpressionTraitsFn, emptyTraitExpression } from "."
import { ExtendFn, StaticMembers } from "./util"
type AddAbstractToImplClass<
@@ -28,7 +28,7 @@ type RemoveAbstractFromImplClass<
export class Trait<
Super extends TraitExpression<typeof NullTraitExpressionSuperclass, any>[],
Super extends TraitExpression<typeof TraitExpressionNullSuperclass, any>,
Abstract extends {},
ImplClass extends Class<{}, []>,
> {
@@ -54,7 +54,7 @@ export interface TraitOwnImplClassFn extends Fn {
export type TraitOwnImplClass<T> = Call<TraitOwnImplClassFn, T>
export interface TraitOwnImplInstanceFn extends Fn {
return: this["arg0"] extends Trait<any, infer Abstract, infer ImplClass>
return: this["arg0"] extends Trait<any, any, infer ImplClass>
? InstanceType<ImplClass>
: never
}
@@ -77,6 +77,22 @@ export interface TraitOwnInstanceFn extends Fn {
export type TraitOwnInstance<T> = Call<TraitOwnInstanceFn, T>
export interface TraitSupertraitsFn extends Fn {
return: this["arg0"] extends Trait<infer Super, any, any>
? Call<TraitExpressionTraitsFn, Super>
: never
}
export interface TraitAbstractFn extends Fn {
return: this["arg0"] extends Trait<infer Super, infer Abstract, any>
? Call<ExtendFn, [
...Call<TraitExpressionAbstractFn, Super>,
Abstract,
]>
: never
}
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"
export function trait<
@@ -89,7 +105,7 @@ export function trait<
),
) {
return new Trait(
[] as const,
emptyTraitExpression,
abstract as Abstract,
apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImplClass<ImplClassWithAbstract, Abstract>,
)