0.1.0 #1
@@ -1,10 +1,10 @@
|
|||||||
import { Call, Pipe, Tuples } from "hotscript"
|
import { Call, Pipe, Tuples } from "hotscript"
|
||||||
import { AbstractClass, Opaque } from "type-fest"
|
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"
|
import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util"
|
||||||
|
|
||||||
|
|
||||||
class TraitsExpression<
|
class TraitExpression<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<any>,
|
||||||
Traits extends readonly Trait<any, 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>> = (
|
ConstructorParameters<Super>
|
||||||
Exp extends TraitsExpression<any, infer Traits>
|
> &
|
||||||
|
|
||||||
|
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, [
|
? Pipe<Traits, [
|
||||||
Tuples.Map<TraitAbstractMembersFn>,
|
Tuples.Map<TraitAbstractMembersFn>,
|
||||||
ExtendFn,
|
ExtendFn,
|
||||||
@@ -61,7 +87,7 @@ export function extendsAndExpresses<
|
|||||||
superclass: Super,
|
superclass: Super,
|
||||||
...traits: Traits
|
...traits: Traits
|
||||||
) {
|
) {
|
||||||
return new TraitsExpression(superclass, traits)
|
return new TraitExpression(superclass, traits)
|
||||||
}
|
}
|
||||||
|
|
||||||
class DefaultSuperclass {}
|
class DefaultSuperclass {}
|
||||||
@@ -71,5 +97,5 @@ export function expresses<
|
|||||||
>(
|
>(
|
||||||
...traits: Traits
|
...traits: Traits
|
||||||
) {
|
) {
|
||||||
return new TraitsExpression(DefaultSuperclass, traits)
|
return new TraitExpression(DefaultSuperclass, traits)
|
||||||
}
|
}
|
||||||
|
|||||||
10
src/tests.ts
10
src/tests.ts
@@ -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 =>
|
const PrintsHelloOnNew = trait()(Super =>
|
||||||
@@ -52,7 +54,11 @@ const exp = extendsAndExpresses(
|
|||||||
Identifiable<bigint>(),
|
Identifiable<bigint>(),
|
||||||
// Identifiable<number>()
|
// 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> {
|
class User extends exp.extends() implements Implements<typeof exp> {
|
||||||
id: bigint = -1n
|
id: bigint = -1n
|
||||||
|
|||||||
@@ -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>
|
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 ExtendFn = Tuples.Reduce<ExtendReducerFn, {}>
|
||||||
export type Extend<T extends readonly object[]> = Call<ExtendFn, T>
|
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>
|
||||||
|
|||||||
Reference in New Issue
Block a user