import { Call, ComposeLeft } from "hotscript" import { Implements, TraitExpressionAbstractFn, abstract, expression, trait } from "." import { SimplifyFn } from "./util" 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, typeof exp> // exp.subtrait( // s => { // interface Subtrait extends (typeof s) { // } // return abstract() // }, // ) class User extends exp.extends implements Implements { declare status: { _tag: "awaitingPayment" } | { _tag: "active"; activeSince: Date; expiresAt?: Date | undefined } | { _tag: "expired"; expiredSince: Date } id: bigint = -1n } console.log(new User())