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