import { Simplify } from "type-fest" import { Implements, Trait, abstract, expression, trait } from "." import { Pipe } from "hotscript" const PrintsHelloOnNew = trait( abstract(), Super => class PrintsHelloOnNew extends Super { constructor(...args: any[]) { super(...args) console.log("Hello!") } }, ) const Identifiable = () => trait( abstract<{ readonly id: ID }>(), Super => class Identifiable extends Super { equals(el: Identifiable) { return this.id === el.id } }, ) const StatefulSubscription = trait( abstract<{ readonly isStatefulSubscription: true readonly status: ( { _tag: "awaitingPayment" } | { _tag: "active", activeSince: Date, expiresAt?: Date } | { _tag: "expired", expiredSince: Date } ) }>(), Super => class StatefulSubscription extends Super {}, ) const ActiveStatefulSubscription = expression .expresses(StatefulSubscription) .build() .subtrait( exp => { interface IActiveStatefulSubscription extends Implements { readonly isActiveStatefulSubscription: true readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date } } return abstract() }, Super => class ActiveStatefulSubscription extends Super {}, ) type T = Trait.Instance class TestSuperclass { // id: number = 69 // static test = 69 } const exp = expression .extends(TestSuperclass) .expresses( PrintsHelloOnNew, Identifiable(), // Identifiable(), ActiveStatefulSubscription, ) .build() type Abs = Implements class User extends exp.extends implements Implements { readonly isStatefulSubscription: true = true readonly isActiveStatefulSubscription: true = true declare status: { _tag: "active"; activeSince: Date; expiresAt?: Date | undefined } id: bigint = -1n } console.log(new User())