This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user