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

This commit is contained in:
Julien Valverdé
2024-02-04 23:59:12 +01:00
parent 56e4af7302
commit 33275ae63e
3 changed files with 33 additions and 28 deletions

View File

@@ -28,18 +28,27 @@ type RemoveAbstractFromImplClass<
export class Trait<
Super extends TraitExpression<typeof TraitExpressionNullSuperclass, Trait<any, any, any>[], Trait<any, any, any>[]>,
Abstract extends {},
ImplClass extends Class<{}, []>,
Supertraits extends TraitExpression<typeof TraitExpressionNullSuperclass, Trait<any, any, any>[], Trait<any, any, any>[]>,
Abstract extends {},
ImplClass extends Class<{}, []>,
> {
constructor(
readonly supertraits: Super,
readonly supertraits: Supertraits,
readonly abstract: Abstract,
readonly apply: (Super: AbstractClass<{}>) => ImplClass,
) {}
}
export namespace Trait {
export type OwnSupertraits<T> = (
T extends Trait<infer Supertraits, any, any>
? Supertraits
: never
)
export interface OwnSupertraitsFn extends Fn {
return: Trait.OwnSupertraits<this["arg0"]>
}
export type OwnAbstract<T> = (
T extends Trait<any, infer Abstract, any>
? Abstract
@@ -88,8 +97,8 @@ export namespace Trait {
}
export type Supertraits<T> = (
T extends Trait<infer Super, any, any>
? TraitExpression.AllTraits<Super>
T extends Trait<infer Supertraits, any, any>
? TraitExpression.AllTraits<Supertraits>
: never
)
export interface SupertraitsFn extends Fn {

View File

@@ -73,40 +73,36 @@ type SpreadSupertraits<Traits extends Trait<any, any, any>[]> = (
>
)
interface PrependTraitSupertraitsFn extends Fn {
return: this["arg0"] extends Trait<infer Super, any, any>
? Super extends TraitExpression<any, any, infer AllTraits>
? [...AllTraits, this["arg0"]]
: never
: never
return: [...Trait.Supertraits<this["arg0"]>, this["arg0"]]
}
type AbstractMembersExtendable<
Super extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Call<ExtendableFn, [
InstanceType<Super>,
InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>,
]>
)
type ImplInstanceExtendable<
Super extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Call<ExtendableFn, [
InstanceType<Super>,
InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>,
]>
)
type ImplStaticMembersExtendable<
Super extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Pipe<[
Super,
Superclass,
...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>,
], [
Tuples.Map<StaticMembersFn>,
@@ -115,19 +111,19 @@ type ImplStaticMembersExtendable<
)
type GetTraitExpression<
Super extends AbstractClass<{}>,
OwnTraits extends Trait<any, any, any>[],
AllTraits extends Trait<any, any, any>[],
Superclass extends AbstractClass<{}>,
OwnTraits extends Trait<any, any, any>[],
AllTraits extends Trait<any, any, any>[],
> = (
Call<Tuples.IsEmpty, AllTraits> extends true
? "Cannot express an empty list of traits."
: AbstractMembersExtendable<Super, AllTraits> extends false
: AbstractMembersExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits abstract members and/or the superclass instance."
: ImplInstanceExtendable<Super, AllTraits> extends false
: ImplInstanceExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation instances and/or the superclass instance."
: ImplStaticMembersExtendable<Super, AllTraits> extends false
: ImplStaticMembersExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation static members and/or the superclass static members."
: TraitExpression<Super, OwnTraits, AllTraits>
: TraitExpression<Superclass, OwnTraits, AllTraits>
)

View File

@@ -57,7 +57,7 @@ const builder = expression
StatefulSubscription,
)
type T = TraitExpression.OwnTraits<typeof builder.expression>
type T = TraitExpression.AllTraits<typeof builder.expression>
const exp = builder.get()
type Abs = Implements<typeof exp>