0.1.0 #1
@@ -4,18 +4,8 @@ import { AbstractTag, Trait, TraitAbstractMembersFn, TraitApplierSuperTag, Trait
|
|||||||
import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util"
|
import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util"
|
||||||
|
|
||||||
|
|
||||||
type SubtraitApplier<
|
|
||||||
Traits extends Trait<any, any>[],
|
|
||||||
Abstract extends object,
|
|
||||||
ImplWithAbstract extends Class<Abstract, []>,
|
|
||||||
> = (
|
|
||||||
(Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
|
|
||||||
Opaque<ImplWithAbstract, TraitApplierSuperTag>
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
class TraitExpression<
|
class TraitExpression<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any>[],
|
Traits extends Trait<any, any>[],
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
@@ -52,8 +42,8 @@ class TraitExpression<
|
|||||||
}
|
}
|
||||||
|
|
||||||
subtrait<
|
subtrait<
|
||||||
SubtraitAbstract extends object,
|
SubtraitAbstract extends {},
|
||||||
SubtraitImplWithAbstract extends Class<any>,
|
SubtraitImplWithAbstract extends Class<{}>,
|
||||||
>(
|
>(
|
||||||
abstract: (
|
abstract: (
|
||||||
abstract: Pipe<Traits, [
|
abstract: Pipe<Traits, [
|
||||||
@@ -80,7 +70,7 @@ export type Implements<Exp extends TraitExpression<any, any>> = (
|
|||||||
|
|
||||||
|
|
||||||
class TraitExpressionBuilder<
|
class TraitExpressionBuilder<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any>[],
|
Traits extends Trait<any, any>[],
|
||||||
> {
|
> {
|
||||||
constructor(public expression: TraitExpression<Super, Traits>) {}
|
constructor(public expression: TraitExpression<Super, Traits>) {}
|
||||||
@@ -118,7 +108,7 @@ class TraitExpressionBuilder<
|
|||||||
|
|
||||||
|
|
||||||
type AbstractMembersExtendable<
|
type AbstractMembersExtendable<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any>[],
|
Traits extends Trait<any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Call<ExtendableFn, [
|
Call<ExtendableFn, [
|
||||||
@@ -128,7 +118,7 @@ type AbstractMembersExtendable<
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ImplInstanceExtendable<
|
type ImplInstanceExtendable<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any>[],
|
Traits extends Trait<any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Call<ExtendableFn, [
|
Call<ExtendableFn, [
|
||||||
@@ -138,7 +128,7 @@ type ImplInstanceExtendable<
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ImplStaticMembersExtendable<
|
type ImplStaticMembersExtendable<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any>[],
|
Traits extends Trait<any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Pipe<[
|
Pipe<[
|
||||||
@@ -151,7 +141,7 @@ type ImplStaticMembersExtendable<
|
|||||||
)
|
)
|
||||||
|
|
||||||
type GetTraitExpression<
|
type GetTraitExpression<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any>[],
|
Traits extends Trait<any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Call<Tuples.IsEmpty, Traits> extends true
|
Call<Tuples.IsEmpty, Traits> extends true
|
||||||
|
|||||||
55
src/trait.ts
55
src/trait.ts
@@ -27,19 +27,29 @@ type RemoveAbstractFromImpl<
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
export type TraitTag = "@thilawyn/traitify-ts/Trait"
|
// export type TraitTag = "@thilawyn/traitify-ts/Trait"
|
||||||
|
|
||||||
export type Trait<
|
// export type Trait<
|
||||||
|
// Abstract extends {},
|
||||||
|
// Impl extends Class<{}, []>,
|
||||||
|
// > = (
|
||||||
|
// Opaque<{
|
||||||
|
// readonly apply: TraitApplier<
|
||||||
|
// Abstract,
|
||||||
|
// AddAbstractToImpl<Impl, Abstract>
|
||||||
|
// >
|
||||||
|
// }, TraitTag>
|
||||||
|
// )
|
||||||
|
|
||||||
|
export class Trait<
|
||||||
Abstract extends {},
|
Abstract extends {},
|
||||||
Impl extends Class<{}, []>,
|
Impl extends Class<{}, []>,
|
||||||
> = (
|
> {
|
||||||
Opaque<{
|
constructor(
|
||||||
readonly apply: TraitApplier<
|
readonly abstract: Abstract,
|
||||||
Abstract,
|
readonly apply: (Super: AbstractClass<{}>) => Impl,
|
||||||
AddAbstractToImpl<Impl, Abstract>
|
) {}
|
||||||
>
|
}
|
||||||
}, TraitTag>
|
|
||||||
)
|
|
||||||
|
|
||||||
export type TraitAbstractMembers<T> = (
|
export type TraitAbstractMembers<T> = (
|
||||||
T extends Trait<infer AbstractMembers, any>
|
T extends Trait<infer AbstractMembers, any>
|
||||||
@@ -96,24 +106,17 @@ export interface TraitInstanceFn extends Fn {
|
|||||||
|
|
||||||
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"
|
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"
|
||||||
|
|
||||||
export type TraitApplier<
|
|
||||||
Abstract extends {},
|
|
||||||
ImplWithAbstract extends Class<Abstract, []>,
|
|
||||||
> = (
|
|
||||||
(Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
|
|
||||||
Opaque<ImplWithAbstract, TraitApplierSuperTag>
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
export function trait<
|
export function trait<
|
||||||
Abstract extends {},
|
Abstract extends {},
|
||||||
ImplWithAbstract extends Class<Abstract, []>,
|
ImplWithAbstract extends Class<Abstract, []>,
|
||||||
>(
|
>(
|
||||||
abstract: Opaque<Abstract, AbstractTag>,
|
abstract: Opaque<Abstract, AbstractTag>,
|
||||||
apply: TraitApplier<Abstract, ImplWithAbstract>,
|
apply: (Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
|
||||||
): Trait<
|
Opaque<ImplWithAbstract, TraitApplierSuperTag>
|
||||||
Abstract,
|
),
|
||||||
RemoveAbstractFromImpl<ImplWithAbstract, Abstract>
|
) {
|
||||||
> {
|
return new Trait(
|
||||||
return { apply } as any
|
abstract as Abstract,
|
||||||
|
apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImpl<ImplWithAbstract, Abstract>,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user