Refactoring
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-02-03 04:09:35 +01:00
parent 956457ee18
commit bdfc57481d
2 changed files with 37 additions and 44 deletions

View File

@@ -4,18 +4,8 @@ import { AbstractTag, Trait, TraitAbstractMembersFn, TraitApplierSuperTag, Trait
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<
Super extends AbstractClass<any>,
Super extends AbstractClass<{}>,
Traits extends Trait<any, any>[],
> {
constructor(
@@ -52,8 +42,8 @@ class TraitExpression<
}
subtrait<
SubtraitAbstract extends object,
SubtraitImplWithAbstract extends Class<any>,
SubtraitAbstract extends {},
SubtraitImplWithAbstract extends Class<{}>,
>(
abstract: (
abstract: Pipe<Traits, [
@@ -80,7 +70,7 @@ export type Implements<Exp extends TraitExpression<any, any>> = (
class TraitExpressionBuilder<
Super extends AbstractClass<any>,
Super extends AbstractClass<{}>,
Traits extends Trait<any, any>[],
> {
constructor(public expression: TraitExpression<Super, Traits>) {}
@@ -118,7 +108,7 @@ class TraitExpressionBuilder<
type AbstractMembersExtendable<
Super extends AbstractClass<any>,
Super extends AbstractClass<{}>,
Traits extends Trait<any, any>[],
> = (
Call<ExtendableFn, [
@@ -128,7 +118,7 @@ type AbstractMembersExtendable<
)
type ImplInstanceExtendable<
Super extends AbstractClass<any>,
Super extends AbstractClass<{}>,
Traits extends Trait<any, any>[],
> = (
Call<ExtendableFn, [
@@ -138,7 +128,7 @@ type ImplInstanceExtendable<
)
type ImplStaticMembersExtendable<
Super extends AbstractClass<any>,
Super extends AbstractClass<{}>,
Traits extends Trait<any, any>[],
> = (
Pipe<[
@@ -151,7 +141,7 @@ type ImplStaticMembersExtendable<
)
type GetTraitExpression<
Super extends AbstractClass<any>,
Super extends AbstractClass<{}>,
Traits extends Trait<any, any>[],
> = (
Call<Tuples.IsEmpty, Traits> extends true

View File

@@ -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 {},
Impl extends Class<{}, []>,
> = (
Opaque<{
readonly apply: TraitApplier<
Abstract,
AddAbstractToImpl<Impl, Abstract>
>
}, TraitTag>
)
> {
constructor(
readonly abstract: Abstract,
readonly apply: (Super: AbstractClass<{}>) => Impl,
) {}
}
export type TraitAbstractMembers<T> = (
T extends Trait<infer AbstractMembers, any>
@@ -96,24 +106,17 @@ export interface TraitInstanceFn extends Fn {
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<
Abstract extends {},
ImplWithAbstract extends Class<Abstract, []>,
>(
abstract: Opaque<Abstract, AbstractTag>,
apply: TraitApplier<Abstract, ImplWithAbstract>,
): Trait<
Abstract,
RemoveAbstractFromImpl<ImplWithAbstract, Abstract>
> {
return { apply } as any
apply: (Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
Opaque<ImplWithAbstract, TraitApplierSuperTag>
),
) {
return new Trait(
abstract as Abstract,
apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImpl<ImplWithAbstract, Abstract>,
)
}