This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import { extendsAndExpresses, trait } from "./trait-inheritance"
|
import { expresses, trait } from "./trait-inheritance"
|
||||||
|
|
||||||
|
|
||||||
const Identified = <ID>() =>
|
const Identifiable = <ID>() =>
|
||||||
trait(Parent => {
|
trait(Parent => {
|
||||||
abstract class Identified extends Parent {
|
abstract class Identified extends Parent {
|
||||||
abstract id: ID
|
abstract id: ID
|
||||||
@@ -9,11 +9,25 @@ const Identified = <ID>() =>
|
|||||||
equals(el: Identified) {
|
equals(el: Identified) {
|
||||||
return this.id === el.id
|
return this.id === el.id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constructor(...args: any[]) {
|
||||||
|
super(...args)
|
||||||
|
console.log("Identified constructor")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Identified
|
return Identified
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const ImplementsIdentifiable = <ID>(defaultID: ID) =>
|
||||||
|
trait(Parent => {
|
||||||
|
abstract class ImplementsIdentifiable extends Identifiable<ID>()(Parent) {
|
||||||
|
id: ID = defaultID
|
||||||
|
}
|
||||||
|
|
||||||
|
return ImplementsIdentifiable
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
const Permissible = trait(Parent => {
|
const Permissible = trait(Parent => {
|
||||||
abstract class Permissible extends Parent {
|
abstract class Permissible extends Parent {
|
||||||
@@ -30,14 +44,16 @@ const Permissible = trait(Parent => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
const UserProto = extendsAndExpresses(class {}, [
|
const UserProto = expresses(
|
||||||
Identified<bigint>(),
|
// Identifiable<bigint>(),
|
||||||
|
ImplementsIdentifiable(0n),
|
||||||
Permissible,
|
Permissible,
|
||||||
] as const)
|
)
|
||||||
|
|
||||||
class User extends UserProto {
|
class User extends UserProto {
|
||||||
constructor(readonly id: bigint) {
|
constructor(id: bigint) {
|
||||||
super()
|
super()
|
||||||
|
this.id = id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,13 +38,12 @@ export function trait<
|
|||||||
|
|
||||||
|
|
||||||
export function extendsAndExpresses<
|
export function extendsAndExpresses<
|
||||||
C extends AbstractClass<any, any>,
|
C extends AbstractClass<any>,
|
||||||
Traits extends readonly Trait<any>[],
|
Traits extends readonly Trait<any>[],
|
||||||
>(
|
>(
|
||||||
extend: C,
|
extend: C,
|
||||||
traits: Traits,
|
traits: Traits,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
return traits.reduce(
|
return traits.reduce(
|
||||||
(previous, trait) => trait(previous),
|
(previous, trait) => trait(previous),
|
||||||
extend,
|
extend,
|
||||||
@@ -71,5 +70,12 @@ export function extendsAndExpresses<
|
|||||||
>
|
>
|
||||||
>
|
>
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function expresses<
|
||||||
|
Traits extends readonly Trait<any>[],
|
||||||
|
>(
|
||||||
|
...traits: Traits
|
||||||
|
) {
|
||||||
|
return extendsAndExpresses(Object, traits)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user