Working trait expression implements

This commit is contained in:
Julien Valverdé
2024-01-31 03:22:23 +01:00
parent e493331ff3
commit ff3991ae45
7 changed files with 49 additions and 62 deletions

View File

@@ -0,0 +1,16 @@
import { Call, Fn, Tuples } from "hotscript"
type CommonKeys<A, B> = Extract<keyof A, keyof B>
type ExtendReducer<Super, Self> = (
Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
? Omit<Super, CommonKeys<Self, Super>> & Self
: never
)
interface ExtendReducerFn extends Fn {
return: ExtendReducer<this["arg0"], this["arg1"]>
}
export type ExtendFn = Tuples.Reduce<ExtendReducerFn, {}>
export type Extend<T extends readonly object[]> = Call<ExtendFn, T>

View File

@@ -1,3 +1,3 @@
export * from "./class"
export * from "./extend"
export * from "./inheritance"
export * from "./trait"

View File

@@ -1,22 +0,0 @@
import { Trait, TraitAbstractMembers, TraitClass } from ".."
export type TraitsAbstractMembers<Traits extends readonly Trait<any, any>[]> = (
Traits extends [infer T, ...infer Rest]
? T extends Trait<any, any>
? Rest extends Trait<any, any>[]
? [TraitAbstractMembers<T>, ...TraitsClasses<Rest>]
: never
: never
: []
)
export type TraitsClasses<Traits extends readonly Trait<any, any>[]> = (
Traits extends [infer T, ...infer Rest]
? T extends Trait<any, any>
? Rest extends Trait<any, any>[]
? [TraitClass<T>, ...TraitsClasses<Rest>]
: never
: never
: []
)