0.1.0 #1

Merged
Thilawyn merged 65 commits from next into master 2024-02-06 03:15:40 +01:00
2 changed files with 62 additions and 34 deletions
Showing only changes of commit 29148cd42b - Show all commits

View File

@@ -13,8 +13,8 @@ class TraitExpression<
readonly traits: Traits, readonly traits: Traits,
) {} ) {}
then<V>(fn: (e: this) => V): V { get implements() {
return fn(this) return {}
} }
extends(): ( extends(): (
@@ -57,6 +57,44 @@ export type Implements<Exp extends TraitExpression<any, any>> = (
) )
class TraitExpressionBuilder<
Super extends AbstractClass<any>,
Traits extends readonly Trait<any, any>[],
> {
constructor(public expression: TraitExpression<Super, Traits>) {}
extends<
NewSuper extends AbstractClass<any>
>(superclass: NewSuper) {
return new TraitExpressionBuilder(
new TraitExpression(
superclass,
this.expression.traits,
)
)
}
expresses<
AppendTraits extends readonly Trait<any, any>[]
>(...traits: AppendTraits) {
return new TraitExpressionBuilder(
new TraitExpression(
this.expression.superclass,
[...this.expression.traits, ...traits] as const,
)
)
}
get() {
return this.expression as GetTraitExpression<Super, Traits>
}
then<V>(fn: (expression: typeof this.expression) => V): V {
return fn(this.expression)
}
}
type AbstractMembersExtendable< type AbstractMembersExtendable<
Super extends AbstractClass<any>, Super extends AbstractClass<any>,
Traits extends readonly Trait<any, any>[], Traits extends readonly Trait<any, any>[],
@@ -90,8 +128,7 @@ type ImplStaticMembersExtendable<
]> ]>
) )
type GetTraitExpression<
type ExtendsAndExpressesReturnType<
Super extends AbstractClass<any>, Super extends AbstractClass<any>,
Traits extends readonly Trait<any, any>[], Traits extends readonly Trait<any, any>[],
> = ( > = (
@@ -106,22 +143,9 @@ type ExtendsAndExpressesReturnType<
: TraitExpression<Super, Traits> : TraitExpression<Super, Traits>
) )
export function extendsAndExpresses<
Super extends AbstractClass<any>,
Traits extends readonly Trait<any, any>[],
>(
superclass: Super,
...traits: Traits
): ExtendsAndExpressesReturnType<Super, Traits> {
return new TraitExpression(superclass, traits) as any
}
class DefaultSuperclass {} class DefaultSuperclass {}
export function expresses< export const expression = new TraitExpressionBuilder(
Traits extends readonly Trait<any, any>[], new TraitExpression(DefaultSuperclass, [] as const)
>( )
...traits: Traits
): ExtendsAndExpressesReturnType<typeof DefaultSuperclass, Traits> {
return new TraitExpression(DefaultSuperclass, traits) as any
}

View File

@@ -1,4 +1,4 @@
import { Implements, TraitAbstractMembers, extendsAndExpresses, trait } from "." import { Implements, TraitAbstractMembers, expression, trait } from "."
const PrintsHelloOnNew = trait()(Super => const PrintsHelloOnNew = trait()(Super =>
@@ -44,21 +44,25 @@ const ActiveStatefulSubscription = trait<ActiveStatefulSubscriptionAbstractMembe
class TestSuperclass { class TestSuperclass {
// id: number = 69 // id: number = 69
static test = 69 // static test = 69
} }
const User = extendsAndExpresses( const builder = expression
TestSuperclass, .extends(TestSuperclass)
PrintsHelloOnNew, .expresses(
// PrintsHelloOnNew,
Identifiable<bigint>(), Identifiable<bigint>(),
// Identifiable<number>() // Identifiable<number>(),
).then(e => )
class User
extends e.extends() type Impl = Implements<typeof builder.expression>
implements Implements<typeof e> {
id: bigint = -1n
} const exp = builder.get()
)
class User extends exp.extends() implements (typeof exp.implements) {
// id: bigint = -1n
}
console.log(new User()) console.log(new User())