Working subtraiting
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-02-05 03:19:12 +01:00
parent a123da55fe
commit 6853bcbee8
7 changed files with 121 additions and 103 deletions

View File

@@ -4,6 +4,67 @@ import { Trait, TraitExpression, emptyTraitExpression } from "."
import { ExtendableFn, StaticMembersFn } from "./util"
type SpreadSupertraits<Traits extends Trait<any, any, any>[]> = (
Call<
Tuples.FlatMap<PrependTraitSupertraitsFn>,
Traits
>
)
interface PrependTraitSupertraitsFn extends Fn {
return: [...Trait.Supertraits<this["arg0"]>, this["arg0"]]
}
type AbstractMembersExtendable<
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Call<ExtendableFn, [
InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>,
]>
)
type ImplInstanceExtendable<
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Call<ExtendableFn, [
InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>,
]>
)
type ImplStaticMembersExtendable<
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Pipe<[
Superclass,
...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>,
], [
Tuples.Map<StaticMembersFn>,
ExtendableFn,
]>
)
type BuildTraitExpression<
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<Superclass, AllTraits> extends false
? "Type conflict between the traits abstract members and/or the superclass instance."
: ImplInstanceExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation instances and/or the superclass instance."
: ImplStaticMembersExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation static members and/or the superclass static members."
: TraitExpression<Superclass, OwnTraits, AllTraits>
)
class TraitExpressionBuilder<
Super extends AbstractClass<{}>,
OwnTraits extends Trait<any, any, any>[],
@@ -67,66 +128,4 @@ class TraitExpressionBuilder<
}
}
type SpreadSupertraits<Traits extends Trait<any, any, any>[]> = (
Call<
Tuples.FlatMap<PrependTraitSupertraitsFn>,
Traits
>
)
interface PrependTraitSupertraitsFn extends Fn {
return: [...Trait.Supertraits<this["arg0"]>, this["arg0"]]
}
type AbstractMembersExtendable<
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Call<ExtendableFn, [
InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>,
]>
)
type ImplInstanceExtendable<
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Call<ExtendableFn, [
InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>,
]>
)
type ImplStaticMembersExtendable<
Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[],
> = (
Pipe<[
Superclass,
...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>,
], [
Tuples.Map<StaticMembersFn>,
ExtendableFn,
]>
)
type BuildTraitExpression<
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<Superclass, AllTraits> extends false
? "Type conflict between the traits abstract members and/or the superclass instance."
: ImplInstanceExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation instances and/or the superclass instance."
: ImplStaticMembersExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation static members and/or the superclass static members."
: TraitExpression<Superclass, OwnTraits, AllTraits>
)
export const expression = new TraitExpressionBuilder(emptyTraitExpression)