Co-authored-by: Julien Valverdé <julien.valverde@mailo.com> Reviewed-on: https://git.jvalver.de/Thilawyn/traitify-ts/pulls/3
This commit was merged in pull request #3.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { Call, Fn, Pipe, Tuples } from "hotscript"
|
||||
import { AbstractClass } from "type-fest"
|
||||
import { Trait, TraitExpression, emptyTraitExpression } from "."
|
||||
import { Trait } from "./Trait"
|
||||
import { TraitExpression, emptyTraitExpression } from "./TraitExpression"
|
||||
import { ExtendableFn, StaticMembersFn } from "./util"
|
||||
|
||||
|
||||
@@ -19,9 +20,9 @@ type AbstractMembersExtendable<
|
||||
Superclass extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any, any>[],
|
||||
> = (
|
||||
Call<ExtendableFn, [
|
||||
InstanceType<Superclass>,
|
||||
...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>,
|
||||
Pipe<Traits, [
|
||||
Tuples.Map<Trait.OwnAbstractFn>,
|
||||
Tuples.Prepend<InstanceType<Superclass>>,
|
||||
]>
|
||||
)
|
||||
|
||||
@@ -29,9 +30,9 @@ type ImplInstanceExtendable<
|
||||
Superclass extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any, any>[],
|
||||
> = (
|
||||
Call<ExtendableFn, [
|
||||
InstanceType<Superclass>,
|
||||
...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>,
|
||||
Pipe<Traits, [
|
||||
Tuples.Map<Trait.OwnImplInstanceFn>,
|
||||
Tuples.Prepend<InstanceType<Superclass>>,
|
||||
]>
|
||||
)
|
||||
|
||||
@@ -39,10 +40,9 @@ type ImplStaticMembersExtendable<
|
||||
Superclass extends AbstractClass<{}>,
|
||||
Traits extends Trait<any, any, any>[],
|
||||
> = (
|
||||
Pipe<[
|
||||
Superclass,
|
||||
...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>,
|
||||
], [
|
||||
Pipe<Traits, [
|
||||
Tuples.Map<Trait.OwnImplClassFn>,
|
||||
Tuples.Prepend<Superclass>,
|
||||
Tuples.Map<StaticMembersFn>,
|
||||
ExtendableFn,
|
||||
]>
|
||||
@@ -53,24 +53,22 @@ type BuildTraitExpression<
|
||||
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>
|
||||
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>[],
|
||||
AllTraits extends Trait<any, any, any>[],
|
||||
Superclass extends AbstractClass<{}>,
|
||||
const OwnTraits extends Trait<any, any, any>[],
|
||||
const AllTraits extends Trait<any, any, any>[],
|
||||
> {
|
||||
constructor(private expression: TraitExpression<Super, OwnTraits, AllTraits>) {}
|
||||
constructor(private expression: TraitExpression<Superclass, OwnTraits, AllTraits>) {}
|
||||
|
||||
extends<
|
||||
Super extends AbstractClass<any>
|
||||
@@ -87,25 +85,25 @@ class TraitExpressionBuilder<
|
||||
}
|
||||
|
||||
expresses<
|
||||
Traits extends Trait<any, any, any>[]
|
||||
const Traits extends Trait<any, any, any>[]
|
||||
>(
|
||||
...traits: Traits
|
||||
): TraitExpressionBuilder<
|
||||
Super,
|
||||
Superclass,
|
||||
[...OwnTraits, ...Traits],
|
||||
[...AllTraits, ...SpreadSupertraits<Traits>]
|
||||
> {
|
||||
return new TraitExpressionBuilder(
|
||||
new TraitExpression(
|
||||
this.expression.superclass,
|
||||
[...this.expression.ownTraits, ...traits] as const,
|
||||
[...this.expression.allTraits, ...this.spreadSupertraits(traits)] as const,
|
||||
[...this.expression.ownTraits, ...traits],
|
||||
[...this.expression.allTraits, ...this.spreadSupertraits(traits)],
|
||||
)
|
||||
) as any
|
||||
)
|
||||
}
|
||||
|
||||
private spreadSupertraits<
|
||||
Traits extends Trait<
|
||||
const Traits extends Trait<
|
||||
TraitExpression<any, any, Trait<any, any, any>[]>,
|
||||
any,
|
||||
any
|
||||
@@ -120,7 +118,7 @@ class TraitExpressionBuilder<
|
||||
}
|
||||
|
||||
build() {
|
||||
return this.expression as BuildTraitExpression<Super, OwnTraits, AllTraits>
|
||||
return this.expression as BuildTraitExpression<Superclass, OwnTraits, AllTraits>
|
||||
}
|
||||
|
||||
then<V>(fn: (expression: ReturnType<typeof this.build>) => V): V {
|
||||
|
||||
Reference in New Issue
Block a user