0.1.2 #9

Merged
Thilawyn merged 8 commits from next into master 2024-01-27 23:40:19 +01:00
Showing only changes of commit f2e64ac681 - Show all commits

View File

@@ -4,8 +4,8 @@ import { ClassesInstances, MergeInheritanceTree } from "./util"
const Identifiable = <ID>() => const Identifiable = <ID>() =>
trait(Parent => { trait(Super => {
abstract class Identifiable extends Parent { abstract class Identifiable extends Super {
abstract readonly id: ID abstract readonly id: ID
equals(el: Identifiable) { equals(el: Identifiable) {
@@ -22,9 +22,9 @@ const Identifiable = <ID>() =>
}) })
const ImplementsIdentifiable = <ID>(defaultID: ID) => const ImplementsIdentifiable = <ID>(defaultID: ID) =>
trait(Parent => { trait(Super => {
abstract class ImplementsIdentifiable extends extendsAndExpresses( abstract class ImplementsIdentifiable extends extendsAndExpresses(
Parent, Super,
Identifiable<ID>(), Identifiable<ID>(),
) { ) {
id: ID = defaultID id: ID = defaultID
@@ -39,8 +39,8 @@ const ImplementsIdentifiable = <ID>(defaultID: ID) =>
}) })
const Permissible = trait(Parent => { const Permissible = trait(Super => {
abstract class Permissible extends Parent { abstract class Permissible extends Super {
static readonly defaultPermissions: string[] = [] static readonly defaultPermissions: string[] = []
permissions: string[] = [] permissions: string[] = []
@@ -72,26 +72,46 @@ console.log(user1)
console.log(user1.equals(user1)) console.log(user1.equals(user1))
abstract class Test1 { const Test1 = trait(Super => {
declare static name: string abstract class Test1 extends Super {
abstract name: string declare static name: string
declare static testValue: (
{ _tag: "type1", value: string } |
{ _tag: "type2", value: number }
)
declare createdAt: Date abstract name: string
declare readonly status: (
{ _tag: "awaitingPayment" } |
{ _tag: "active", activeSince: Date, expiresAt?: Date } |
{ _tag: "expired", expiredSince: Date }
)
}
class Test2 { declare createdAt: Date
declare readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date } declare readonly status: (
} { _tag: "awaitingPayment" } |
{ _tag: "active", activeSince: Date, expiresAt?: Date } |
{ _tag: "expired", expiredSince: Date }
)
}
class Test3 { return Test1
declare lol: 10n })
}
const Test2 = trait(Super => {
abstract class Test2 extends Super {
declare readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date }
}
return Test2
})
const Test3 = trait(Super => {
abstract class Test3 extends Super {
declare static testValue: { _tag: "type2", value: number }
declare lol: 10n
}
return Test3
})
const TestObjectProto = expresses(Test1, Test2, Test3)
TestObjectProto.testValue
type CleanupInheritanceTreeProperties<Classes extends readonly AbstractClass<any>[]> = ( type CleanupInheritanceTreeProperties<Classes extends readonly AbstractClass<any>[]> = (
MergeInheritanceTree< MergeInheritanceTree<