0.1.0 #1

Merged
Thilawyn merged 65 commits from next into master 2024-02-06 03:15:40 +01:00
3 changed files with 23 additions and 19 deletions
Showing only changes of commit 7a449c73cc - Show all commits

View File

@@ -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."

View File

@@ -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
} }

View File

@@ -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>