import { Call } from "hotscript" import { Implements, TraitExpressionTraitsFn, abstract, expression, trait } from "." 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 status: ( { _tag: "awaitingPayment" } | { _tag: "active", activeSince: Date, expiresAt?: Date } | { _tag: "expired", expiredSince: Date } ) }>(), Super => class StatefulSubscription extends Super {}, ) // interface ActiveStatefulSubscriptionAbstractMembers extends TraitAbstractMembers { // readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date } // } // const ActiveStatefulSubscription = trait( // abstract(), // Super => class ActiveStatefulSubscription extends Super {}, // ) class TestSuperclass { // id: number = 69 // static test = 69 } const builder = expression .extends(TestSuperclass) .expresses( PrintsHelloOnNew, Identifiable(), // Identifiable(), StatefulSubscription, ) const exp = builder.get() type Abs = Call class User extends exp.extends implements Implements { id: bigint = -1n } console.log(new User())