0.1.0 #1

Merged
Thilawyn merged 65 commits from next into master 2024-02-06 03:15:40 +01:00
2 changed files with 37 additions and 44 deletions
Showing only changes of commit bdfc57481d - Show all commits

View File

@@ -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

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 {}, 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>,
)
} }