Extendable

This commit is contained in:
Julien Valverdé
2024-02-01 02:21:10 +01:00
parent a5b8a1c184
commit a82c978c9e
3 changed files with 51 additions and 9 deletions

View File

@@ -1,10 +1,10 @@
import { Call, Pipe, Tuples } from "hotscript"
import { AbstractClass, Opaque } from "type-fest"
import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitImplClassFn, TraitImplInstanceFn } from "."
import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitClassFn, TraitImplClassFn, TraitImplInstanceFn, TraitInstanceFn } from "."
import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util"
class TraitsExpression<
class TraitExpression<
Super extends AbstractClass<any>,
Traits extends readonly Trait<any, any>[],
> {
@@ -42,9 +42,35 @@ class TraitsExpression<
}
}
type TraitExpressionOutput<Exp extends TraitExpression<any, any>> = (
Exp extends TraitExpression<infer Super, infer Traits>
? (
AbstractClass<
Pipe<[
InstanceType<Super>,
...Call<Tuples.Map<TraitInstanceFn>, Traits>,
], [
ExtendFn,
SimplifyFn,
]>,
export type Implements<Exp extends TraitsExpression<any, any>> = (
Exp extends TraitsExpression<any, infer Traits>
ConstructorParameters<Super>
> &
Pipe<[
Super,
...Call<Tuples.Map<TraitClassFn>, Traits>,
], [
Tuples.Map<StaticMembersFn>,
ExtendFn,
SimplifyFn,
]>
)
: never
)
export type Implements<Exp extends TraitExpression<any, any>> = (
Exp extends TraitExpression<any, infer Traits>
? Pipe<Traits, [
Tuples.Map<TraitAbstractMembersFn>,
ExtendFn,
@@ -61,7 +87,7 @@ export function extendsAndExpresses<
superclass: Super,
...traits: Traits
) {
return new TraitsExpression(superclass, traits)
return new TraitExpression(superclass, traits)
}
class DefaultSuperclass {}
@@ -71,5 +97,5 @@ export function expresses<
>(
...traits: Traits
) {
return new TraitsExpression(DefaultSuperclass, traits)
return new TraitExpression(DefaultSuperclass, traits)
}

View File

@@ -1,4 +1,6 @@
import { Implements, TraitAbstractMembers, expresses, extendsAndExpresses, trait } from "."
import { Booleans, Call, Compose, ComposeLeft, Match, Pipe, Tuples } from "hotscript"
import { Implements, TraitAbstractMembers, TraitAbstractMembersFn, expresses, extendsAndExpresses, trait } from "."
import { CheckExtendableFn, ExtendFn, Extendable, ExtendableFn, SimplifyFn } from "./util"
const PrintsHelloOnNew = trait()(Super =>
@@ -52,7 +54,11 @@ const exp = extendsAndExpresses(
Identifiable<bigint>(),
// Identifiable<number>()
)
type Impl = Implements<typeof exp>
type ExpImpl = Implements<typeof exp>
type ExpAbstractMembers = Pipe<typeof exp.traits, [
Tuples.Map<TraitAbstractMembersFn>,
]>
type ExpExtendable = Extendable<ExpAbstractMembers>
class User extends exp.extends() implements Implements<typeof exp> {
id: bigint = -1n

View File

@@ -1,4 +1,4 @@
import { Call, Fn, Tuples } from "hotscript"
import { Call, ComposeLeft, Fn, Match, Tuples } from "hotscript"
type CommonKeys<A, B> = Extract<keyof A, keyof B>
@@ -14,3 +14,13 @@ interface ExtendReducerFn extends Fn {
export type ExtendFn = Tuples.Reduce<ExtendReducerFn, {}>
export type Extend<T extends readonly object[]> = Call<ExtendFn, T>
export type ExtendableFn = ComposeLeft<[
ExtendFn,
Match<[
Match.With<never, false>,
Match.With<any, true>,
]>
]>
export type Extendable<T extends readonly object[]> = Call<ExtendableFn, T>