0.1.3 (#3)
All checks were successful
continuous-integration/drone/push Build is passing

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:
Julien Valverdé
2024-02-08 20:01:16 +01:00
parent 98fbed09b3
commit c1c3c07524
10 changed files with 93 additions and 111 deletions

View File

@@ -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 {