Working TraitExpressionBuilder
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
15
src/Trait.ts
15
src/Trait.ts
@@ -1,6 +1,6 @@
|
|||||||
import { Call, Fn } from "hotscript"
|
import { Fn } from "hotscript"
|
||||||
import { AbstractClass, Class, Opaque } from "type-fest"
|
import { AbstractClass, Class, Opaque } from "type-fest"
|
||||||
import { AbstractTag, TraitExpression, TraitExpressionNullSuperclass, TraitExpressionTraitsFn, emptyTraitExpression } from "."
|
import { AbstractTag, TraitExpression, TraitExpressionAllTraits, TraitExpressionNullSuperclass, emptyTraitExpression } from "."
|
||||||
import { StaticMembers } from "./util"
|
import { StaticMembers } from "./util"
|
||||||
|
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ export class Trait<
|
|||||||
ImplClass extends Class<{}, []>,
|
ImplClass extends Class<{}, []>,
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
readonly superExpression: Super,
|
readonly supertraits: Super,
|
||||||
readonly abstract: Abstract,
|
readonly abstract: Abstract,
|
||||||
readonly apply: (Super: AbstractClass<{}>) => ImplClass,
|
readonly apply: (Super: AbstractClass<{}>) => ImplClass,
|
||||||
) {}
|
) {}
|
||||||
@@ -87,10 +87,13 @@ export interface TraitOwnInstanceFn extends Fn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export interface TraitSupertraitsFn extends Fn {
|
export type TraitSupertraits<T> = (
|
||||||
return: this["arg0"] extends Trait<infer Super, any, any>
|
T extends Trait<infer Super, any, any>
|
||||||
? Call<TraitExpressionTraitsFn, Super>
|
? TraitExpressionAllTraits<Super>
|
||||||
: never
|
: never
|
||||||
|
)
|
||||||
|
export interface TraitSupertraitsFn extends Fn {
|
||||||
|
return: TraitSupertraits<this["arg0"]>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Call, ComposeLeft, Fn, Pipe, Tuples } from "hotscript"
|
import { Call, Fn, Pipe, Tuples } from "hotscript"
|
||||||
import { AbstractClass, Class, Opaque } from "type-fest"
|
import { AbstractClass, Class, Opaque } from "type-fest"
|
||||||
import { AbstractTag, Trait, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, TraitSupertraitsFn } from "."
|
import { AbstractTag, Trait, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn } from "."
|
||||||
import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util"
|
import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util"
|
||||||
|
|
||||||
|
|
||||||
export class TraitExpressionNullSuperclass {}
|
export class TraitExpressionNullSuperclass {}
|
||||||
@@ -39,7 +39,7 @@ export class TraitExpression<
|
|||||||
SimplifyFn,
|
SimplifyFn,
|
||||||
]>
|
]>
|
||||||
) {
|
) {
|
||||||
return this.ownTraits.reduce(
|
return this.allTraits.reduce(
|
||||||
(previous, trait) => trait.apply(previous),
|
(previous, trait) => trait.apply(previous),
|
||||||
this.superclass as Opaque<Super, TraitApplierSuperTag>,
|
this.superclass as Opaque<Super, TraitApplierSuperTag>,
|
||||||
) as any
|
) as any
|
||||||
@@ -50,10 +50,9 @@ export class TraitExpression<
|
|||||||
SubtraitImplWithAbstract extends Class<{}>,
|
SubtraitImplWithAbstract extends Class<{}>,
|
||||||
>(
|
>(
|
||||||
abstract: (
|
abstract: (
|
||||||
abstract: Call<
|
abstract: Pipe<typeof this, [
|
||||||
ComposeLeft<[TraitExpressionAbstractFn, SimplifyFn]>,
|
|
||||||
typeof this
|
]>
|
||||||
>
|
|
||||||
) => Opaque<SubtraitAbstract, AbstractTag>,
|
) => Opaque<SubtraitAbstract, AbstractTag>,
|
||||||
|
|
||||||
// impl: ()
|
// impl: ()
|
||||||
@@ -62,42 +61,47 @@ export class TraitExpression<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const emptyTraitExpression = new TraitExpression(
|
export type TraitExpressionSuper<T> = (
|
||||||
TraitExpressionNullSuperclass,
|
T extends TraitExpression<infer Super, any, any>
|
||||||
[] as const,
|
? Super
|
||||||
[] as const,
|
: never
|
||||||
)
|
)
|
||||||
|
export interface TraitExpressionSuperFn extends Fn {
|
||||||
interface PrependTraitSupertraitsFn extends Fn {
|
return: TraitExpressionSuper<this["arg0"]>
|
||||||
return: this["arg0"] extends Trait<any, any, any>
|
|
||||||
? [
|
|
||||||
...Call<TraitSupertraitsFn, this["arg0"]>,
|
|
||||||
this["arg0"],
|
|
||||||
]
|
|
||||||
: never
|
|
||||||
}
|
|
||||||
export interface TraitExpressionTraitsFn extends Fn {
|
|
||||||
return: this["arg0"] extends TraitExpression<any, infer Traits>
|
|
||||||
? Call<Tuples.FlatMap<PrependTraitSupertraitsFn>, Traits>
|
|
||||||
: never
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TraitExpressionAbstractFn extends Fn {
|
export type TraitExpressionOwnTraits<T> = (
|
||||||
return: this["arg0"] extends TraitExpression<any, any>
|
T extends TraitExpression<any, infer OwnTraits, any>
|
||||||
? Pipe<this["arg0"], [
|
? OwnTraits
|
||||||
TraitExpressionTraitsFn,
|
|
||||||
Tuples.Map<TraitOwnAbstractFn>,
|
|
||||||
ExtendFn,
|
|
||||||
]>
|
|
||||||
: never
|
: never
|
||||||
|
)
|
||||||
|
export interface TraitExpressionOwnTraitsFn extends Fn {
|
||||||
|
return: TraitExpressionOwnTraits<this["arg0"]>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Implements<Exp extends TraitExpression<any, any>> = (
|
export type TraitExpressionAllTraits<T> = (
|
||||||
Exp extends TraitExpression<any, infer Traits>
|
T extends TraitExpression<any, any, infer AllTraits>
|
||||||
? Pipe<Traits, [
|
? AllTraits
|
||||||
|
: never
|
||||||
|
)
|
||||||
|
export interface TraitExpressionAllTraitsFn extends Fn {
|
||||||
|
return: TraitExpressionAllTraits<this["arg0"]>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export type Implements<Exp extends TraitExpression<any, any, any>> = (
|
||||||
|
Exp extends TraitExpression<any, infer AllTraits, any>
|
||||||
|
? Pipe<AllTraits, [
|
||||||
Tuples.Map<TraitOwnAbstractFn>,
|
Tuples.Map<TraitOwnAbstractFn>,
|
||||||
ExtendFn,
|
ExtendFn,
|
||||||
SimplifyFn,
|
SimplifyFn,
|
||||||
]>
|
]>
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
export const emptyTraitExpression = new TraitExpression(
|
||||||
|
TraitExpressionNullSuperclass,
|
||||||
|
[] as const,
|
||||||
|
[] as const,
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Call, Fn, Pipe, Tuples } from "hotscript"
|
import { Call, Fn, Pipe, Tuples } from "hotscript"
|
||||||
import { AbstractClass } from "type-fest"
|
import { AbstractClass } from "type-fest"
|
||||||
import { Trait, TraitExpression, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, TraitSupertraitsFn, emptyTraitExpression } from "."
|
import { Trait, TraitExpression, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, emptyTraitExpression } from "."
|
||||||
import { ExtendableFn, StaticMembersFn } from "./util"
|
import { ExtendableFn, StaticMembersFn } from "./util"
|
||||||
|
|
||||||
|
|
||||||
@@ -27,17 +27,18 @@ class TraitExpressionBuilder<
|
|||||||
Traits extends Trait<any, any, any>[]
|
Traits extends Trait<any, any, any>[]
|
||||||
>(
|
>(
|
||||||
...traits: Traits
|
...traits: Traits
|
||||||
) {
|
): TraitExpressionBuilder<
|
||||||
|
Super,
|
||||||
|
[...OwnTraits, ...Traits],
|
||||||
|
[...AllTraits, SpreadSupertraits<Traits>]
|
||||||
|
> {
|
||||||
return new TraitExpressionBuilder(
|
return new TraitExpressionBuilder(
|
||||||
new TraitExpression(
|
new TraitExpression(
|
||||||
this.expression.superclass,
|
this.expression.superclass,
|
||||||
[...this.expression.ownTraits, ...traits] as const,
|
[...this.expression.ownTraits, ...traits] as const,
|
||||||
[
|
[...this.expression.allTraits, ...this.spreadSupertraits(traits)] as const,
|
||||||
...this.expression.allTraits,
|
|
||||||
...this.spreadSupertraits(traits) as SpreadTraitsHierarchy<Traits>,
|
|
||||||
] as const,
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
) as any
|
||||||
}
|
}
|
||||||
|
|
||||||
private spreadSupertraits<
|
private spreadSupertraits<
|
||||||
@@ -50,9 +51,9 @@ class TraitExpressionBuilder<
|
|||||||
traits: Traits
|
traits: Traits
|
||||||
) {
|
) {
|
||||||
return traits.flatMap(trait => [
|
return traits.flatMap(trait => [
|
||||||
...trait.superExpression.allTraits,
|
...trait.supertraits.allTraits,
|
||||||
trait,
|
trait,
|
||||||
])
|
]) as SpreadSupertraits<Traits>
|
||||||
}
|
}
|
||||||
|
|
||||||
get() {
|
get() {
|
||||||
@@ -65,18 +66,17 @@ class TraitExpressionBuilder<
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type SpreadTraitsHierarchy<Traits extends Trait<any, any, any>[]> = (
|
type SpreadSupertraits<Traits extends Trait<any, any, any>[]> = (
|
||||||
Call<
|
Call<
|
||||||
Tuples.FlatMap<PrependTraitSupertraitsFn>,
|
Tuples.FlatMap<PrependTraitSupertraitsFn>,
|
||||||
Traits
|
Traits
|
||||||
>
|
>
|
||||||
)
|
)
|
||||||
interface PrependTraitSupertraitsFn extends Fn {
|
interface PrependTraitSupertraitsFn extends Fn {
|
||||||
return: this["arg0"] extends Trait<any, any, any>
|
return: this["arg0"] extends Trait<infer Super, any, any>
|
||||||
? [
|
? Super extends TraitExpression<any, any, infer AllTraits>
|
||||||
...Call<TraitSupertraitsFn, this["arg0"]>,
|
? [...AllTraits, this["arg0"]]
|
||||||
this["arg0"],
|
: never
|
||||||
]
|
|
||||||
: never
|
: never
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { Call, ComposeLeft } from "hotscript"
|
import { Implements, abstract, expression, trait } from "."
|
||||||
import { Implements, TraitExpressionAbstractFn, abstract, expression, trait } from "."
|
|
||||||
import { SimplifyFn } from "./util"
|
|
||||||
|
|
||||||
|
|
||||||
const PrintsHelloOnNew = trait(
|
const PrintsHelloOnNew = trait(
|
||||||
@@ -60,10 +58,7 @@ const builder = expression
|
|||||||
)
|
)
|
||||||
|
|
||||||
const exp = builder.get()
|
const exp = builder.get()
|
||||||
type Abs = Call<ComposeLeft<[
|
type Abs = Implements<typeof exp>
|
||||||
TraitExpressionAbstractFn,
|
|
||||||
SimplifyFn,
|
|
||||||
]>, typeof exp>
|
|
||||||
|
|
||||||
// exp.subtrait(
|
// exp.subtrait(
|
||||||
// s => {
|
// s => {
|
||||||
|
|||||||
Reference in New Issue
Block a user