0.1.0 #1
@@ -6,18 +6,24 @@ import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util"
|
||||
|
||||
class TraitExpression<
|
||||
Super extends AbstractClass<any>,
|
||||
Traits extends readonly Trait<any, any>[],
|
||||
Traits extends Trait<any, any>[],
|
||||
> {
|
||||
constructor(
|
||||
readonly superclass: Super,
|
||||
readonly traits: Traits,
|
||||
) {}
|
||||
|
||||
get implements() {
|
||||
return {}
|
||||
get implements(): (
|
||||
Pipe<Traits, [
|
||||
Tuples.Map<TraitAbstractMembersFn>,
|
||||
ExtendFn,
|
||||
SimplifyFn,
|
||||
]>
|
||||
) {
|
||||
throw new Error("Not meant to be called")
|
||||
}
|
||||
|
||||
extends(): (
|
||||
get extends(): (
|
||||
AbstractClass<
|
||||
Pipe<[
|
||||
InstanceType<Super>,
|
||||
@@ -59,7 +65,7 @@ export type Implements<Exp extends TraitExpression<any, any>> = (
|
||||
|
||||
class TraitExpressionBuilder<
|
||||
Super extends AbstractClass<any>,
|
||||
Traits extends readonly Trait<any, any>[],
|
||||
Traits extends Trait<any, any>[],
|
||||
> {
|
||||
constructor(public expression: TraitExpression<Super, Traits>) {}
|
||||
|
||||
@@ -75,7 +81,7 @@ class TraitExpressionBuilder<
|
||||
}
|
||||
|
||||
expresses<
|
||||
AppendTraits extends readonly Trait<any, any>[]
|
||||
AppendTraits extends Trait<any, any>[]
|
||||
>(...traits: AppendTraits) {
|
||||
return new TraitExpressionBuilder(
|
||||
new TraitExpression(
|
||||
@@ -89,15 +95,15 @@ class TraitExpressionBuilder<
|
||||
return this.expression as GetTraitExpression<Super, Traits>
|
||||
}
|
||||
|
||||
then<V>(fn: (expression: typeof this.expression) => V): V {
|
||||
return fn(this.expression)
|
||||
then<V>(fn: (expression: ReturnType<typeof this.get>) => V): V {
|
||||
return fn(this.get())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
type AbstractMembersExtendable<
|
||||
Super extends AbstractClass<any>,
|
||||
Traits extends readonly Trait<any, any>[],
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Call<ExtendableFn, [
|
||||
InstanceType<Super>,
|
||||
@@ -107,7 +113,7 @@ type AbstractMembersExtendable<
|
||||
|
||||
type ImplInstanceExtendable<
|
||||
Super extends AbstractClass<any>,
|
||||
Traits extends readonly Trait<any, any>[],
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Call<ExtendableFn, [
|
||||
InstanceType<Super>,
|
||||
@@ -117,7 +123,7 @@ type ImplInstanceExtendable<
|
||||
|
||||
type ImplStaticMembersExtendable<
|
||||
Super extends AbstractClass<any>,
|
||||
Traits extends readonly Trait<any, any>[],
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Pipe<[
|
||||
Super,
|
||||
@@ -130,7 +136,7 @@ type ImplStaticMembersExtendable<
|
||||
|
||||
type GetTraitExpression<
|
||||
Super extends AbstractClass<any>,
|
||||
Traits extends readonly Trait<any, any>[],
|
||||
Traits extends Trait<any, any>[],
|
||||
> = (
|
||||
Call<Tuples.IsEmpty, Traits> extends true
|
||||
? "Cannot express an empty list of traits."
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { Identity, Pipe, Tuples } from "hotscript"
|
||||
import { Implements, TraitAbstractMembers, expression, trait } from "."
|
||||
|
||||
|
||||
@@ -51,17 +52,14 @@ class TestSuperclass {
|
||||
const builder = expression
|
||||
.extends(TestSuperclass)
|
||||
.expresses(
|
||||
// PrintsHelloOnNew,
|
||||
PrintsHelloOnNew,
|
||||
Identifiable<bigint>(),
|
||||
// Identifiable<number>(),
|
||||
)
|
||||
|
||||
type Impl = Implements<typeof builder.expression>
|
||||
|
||||
|
||||
const exp = builder.get()
|
||||
|
||||
class User extends exp.extends() implements (typeof exp.implements) {
|
||||
class User extends exp.extends implements (typeof exp.implements) {
|
||||
// id: bigint = -1n
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ interface ExtendReducerFn extends Fn {
|
||||
}
|
||||
|
||||
export type ExtendFn = Tuples.Reduce<ExtendReducerFn, {}>
|
||||
export type Extend<T extends readonly object[]> = Call<ExtendFn, T>
|
||||
export type Extend<T extends object[]> = Call<ExtendFn, T>
|
||||
|
||||
|
||||
export type ExtendableFn = ComposeLeft<[
|
||||
@@ -23,4 +23,4 @@ export type ExtendableFn = ComposeLeft<[
|
||||
Match.With<any, true>,
|
||||
]>
|
||||
]>
|
||||
export type Extendable<T extends readonly object[]> = Call<ExtendableFn, T>
|
||||
export type Extendable<T extends object[]> = Call<ExtendableFn, T>
|
||||
|
||||
Reference in New Issue
Block a user