TraitBuilder work
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Julien Valverdé
2024-02-17 21:23:08 +01:00
parent 04146f6c69
commit c1f48b9bb2
3 changed files with 19 additions and 63 deletions

View File

@@ -74,50 +74,24 @@ export class TraitBuilder<
private readonly traitApply: (Super: AbstractClass<object>) => ImplClass, private readonly traitApply: (Super: AbstractClass<object>) => ImplClass,
) {} ) {}
abstract<A extends ExtendAbstractSuper<SuperExpression, Abstract>>() { abstract<A extends Abstract>(
_: (Super: AbstractClass<Abstract>) => AbstractClass<A, []>
) {
return new TraitBuilder( return new TraitBuilder(
this.traitSuperExpression, this.traitSuperExpression,
{} as A, {} as Simplify<A>,
this.traitStaticAbstract, this.traitStaticAbstract,
this.traitApply, this.traitApply,
) )
} }
extendAbstract<A extends ExtendAbstractSuper<SuperExpression, Abstract>>( staticAbstract<A extends StaticAbstract>(
_: ( _: (Super: AbstractClass<StaticAbstract>) => AbstractClass<A, []>
Super: AbstractClass<
ExtendAbstractSuper<SuperExpression, Abstract>
>
) => AbstractClass<A, []>
) {
return new TraitBuilder(
this.traitSuperExpression,
{} as A,
this.traitStaticAbstract,
this.traitApply,
)
}
staticAbstract<A extends ExtendStaticAbstractSuper<SuperExpression, StaticAbstract>>() {
return new TraitBuilder(
this.traitSuperExpression,
this.traitAbstract,
{} as A,
this.traitApply,
)
}
extendStaticAbstract<A extends ExtendStaticAbstractSuper<SuperExpression, StaticAbstract>>(
_: (
Super: AbstractClass<
ExtendStaticAbstractSuper<SuperExpression, StaticAbstract>
>
) => AbstractClass<A, []>
) { ) {
return new TraitBuilder( return new TraitBuilder(
this.traitSuperExpression, this.traitSuperExpression,
this.traitAbstract, this.traitAbstract,
{} as A, {} as Simplify<A>,
this.traitApply, this.traitApply,
) )
} }

View File

@@ -1,5 +1,5 @@
import { Fn, Pipe, Tuples } from "hotscript" import { Fn, Pipe, Tuples } from "hotscript"
import { AbstractClass, Class } from "type-fest" import { AbstractClass, Class, Simplify } from "type-fest"
import { Trait } from "./Trait" import { Trait } from "./Trait"
import { TraitBuilder } from "./TraitBuilder" import { TraitBuilder } from "./TraitBuilder"
import { ExtendFn, ExtendPlain, SimplifyFn, StaticMembersFn } from "./util" import { ExtendFn, ExtendPlain, SimplifyFn, StaticMembersFn } from "./util"
@@ -72,8 +72,8 @@ export class TraitExpression<
) { ) {
return new TraitBuilder( return new TraitBuilder(
this, this,
{} as SubtraitAbstract<This>, {} as Simplify<SubtraitAbstract<This>>,
{} as SubtraitStaticAbstract<This>, {} as Simplify<SubtraitStaticAbstract<This>>,
Super => class extends Super {}, Super => class extends Super {},
) )
} }

View File

@@ -18,7 +18,9 @@ const PrintsHelloOnNew = trait
type PrintsHelloOnNewClass = TraitClass<typeof PrintsHelloOnNew> type PrintsHelloOnNewClass = TraitClass<typeof PrintsHelloOnNew>
const Identifiable = <ID>() => trait const Identifiable = <ID>() => trait
.abstract<{ readonly id: ID }>() .abstract(Super => class extends Super {
declare readonly id: ID
})
.implement(Super => class Identifiable extends Super { .implement(Super => class Identifiable extends Super {
equals(el: Identifiable) { equals(el: Identifiable) {
return this.id === el.id return this.id === el.id
@@ -27,17 +29,9 @@ const Identifiable = <ID>() => trait
.build() .build()
const StatefulSubscription = trait const StatefulSubscription = trait
// .abstract<{ .abstract(Super => class extends Super {
// readonly isStatefulSubscription: true declare readonly isStatefulSubscription: true
// readonly status: ( declare readonly status: (
// { _tag: "awaitingPayment" } |
// { _tag: "active", activeSince: Date, expiresAt?: Date } |
// { _tag: "expired", expiredSince: Date }
// )
// }>()
.extendAbstract(Super => class StatefulSubscriptionAbstract extends Super {
readonly isStatefulSubscription!: true
readonly status!: (
{ _tag: "awaitingPayment" } | { _tag: "awaitingPayment" } |
{ _tag: "active", activeSince: Date, expiresAt?: Date } | { _tag: "active", activeSince: Date, expiresAt?: Date } |
{ _tag: "expired", expiredSince: Date } { _tag: "expired", expiredSince: Date }
@@ -51,9 +45,9 @@ const ActiveStatefulSubscription = expression
.expresses(StatefulSubscription) .expresses(StatefulSubscription)
.build() .build()
.subtrait() .subtrait()
.extendAbstract(Super => class extends Super { .abstract(Super => class extends Super {
readonly isActiveStatefulSubscription!: true declare readonly isActiveStatefulSubscription: true
readonly status!: { _tag: "active", activeSince: Date, expiresAt?: Date } declare readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date }
}) })
.build() .build()
@@ -86,15 +80,3 @@ class User extends exp.extends implements Implements<typeof exp> {
} }
console.log(new User()) console.log(new User())
type MyTuple = [
{ values: { gneugneu: string } },
{ values: { ataoy: "issou" } },
]
type MapToValues<T extends { values: object }[]> = {
[K in keyof T]: T[K]["values"]
}
type T = MapToValues<MyTuple>