0.1.0 #1

Merged
Thilawyn merged 65 commits from next into master 2024-02-06 03:15:40 +01:00
3 changed files with 33 additions and 28 deletions
Showing only changes of commit 33275ae63e - Show all commits

View File

@@ -28,18 +28,27 @@ type RemoveAbstractFromImplClass<
export class Trait< export class Trait<
Super extends TraitExpression<typeof TraitExpressionNullSuperclass, Trait<any, any, any>[], Trait<any, any, any>[]>, Supertraits extends TraitExpression<typeof TraitExpressionNullSuperclass, Trait<any, any, any>[], Trait<any, any, any>[]>,
Abstract extends {}, Abstract extends {},
ImplClass extends Class<{}, []>, ImplClass extends Class<{}, []>,
> { > {
constructor( constructor(
readonly supertraits: Super, readonly supertraits: Supertraits,
readonly abstract: Abstract, readonly abstract: Abstract,
readonly apply: (Super: AbstractClass<{}>) => ImplClass, readonly apply: (Super: AbstractClass<{}>) => ImplClass,
) {} ) {}
} }
export namespace Trait { export namespace Trait {
export type OwnSupertraits<T> = (
T extends Trait<infer Supertraits, any, any>
? Supertraits
: never
)
export interface OwnSupertraitsFn extends Fn {
return: Trait.OwnSupertraits<this["arg0"]>
}
export type OwnAbstract<T> = ( export type OwnAbstract<T> = (
T extends Trait<any, infer Abstract, any> T extends Trait<any, infer Abstract, any>
? Abstract ? Abstract
@@ -88,8 +97,8 @@ export namespace Trait {
} }
export type Supertraits<T> = ( export type Supertraits<T> = (
T extends Trait<infer Super, any, any> T extends Trait<infer Supertraits, any, any>
? TraitExpression.AllTraits<Super> ? TraitExpression.AllTraits<Supertraits>
: never : never
) )
export interface SupertraitsFn extends Fn { export interface SupertraitsFn extends Fn {

View File

@@ -73,40 +73,36 @@ type SpreadSupertraits<Traits extends Trait<any, any, any>[]> = (
> >
) )
interface PrependTraitSupertraitsFn extends Fn { interface PrependTraitSupertraitsFn extends Fn {
return: this["arg0"] extends Trait<infer Super, any, any> return: [...Trait.Supertraits<this["arg0"]>, this["arg0"]]
? Super extends TraitExpression<any, any, infer AllTraits>
? [...AllTraits, this["arg0"]]
: never
: never
} }
type AbstractMembersExtendable< type AbstractMembersExtendable<
Super extends AbstractClass<{}>, Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[], Traits extends Trait<any, any, any>[],
> = ( > = (
Call<ExtendableFn, [ Call<ExtendableFn, [
InstanceType<Super>, InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>, ...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>,
]> ]>
) )
type ImplInstanceExtendable< type ImplInstanceExtendable<
Super extends AbstractClass<{}>, Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[], Traits extends Trait<any, any, any>[],
> = ( > = (
Call<ExtendableFn, [ Call<ExtendableFn, [
InstanceType<Super>, InstanceType<Superclass>,
...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>, ...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>,
]> ]>
) )
type ImplStaticMembersExtendable< type ImplStaticMembersExtendable<
Super extends AbstractClass<{}>, Superclass extends AbstractClass<{}>,
Traits extends Trait<any, any, any>[], Traits extends Trait<any, any, any>[],
> = ( > = (
Pipe<[ Pipe<[
Super, Superclass,
...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>, ...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>,
], [ ], [
Tuples.Map<StaticMembersFn>, Tuples.Map<StaticMembersFn>,
@@ -115,19 +111,19 @@ type ImplStaticMembersExtendable<
) )
type GetTraitExpression< type GetTraitExpression<
Super extends AbstractClass<{}>, Superclass extends AbstractClass<{}>,
OwnTraits extends Trait<any, any, any>[], OwnTraits extends Trait<any, any, any>[],
AllTraits extends Trait<any, any, any>[], AllTraits extends Trait<any, any, any>[],
> = ( > = (
Call<Tuples.IsEmpty, AllTraits> extends true Call<Tuples.IsEmpty, AllTraits> extends true
? "Cannot express an empty list of traits." ? "Cannot express an empty list of traits."
: AbstractMembersExtendable<Super, AllTraits> extends false : AbstractMembersExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits abstract members and/or the superclass instance." ? "Type conflict between the traits abstract members and/or the superclass instance."
: ImplInstanceExtendable<Super, AllTraits> extends false : ImplInstanceExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation instances and/or the superclass instance." ? "Type conflict between the traits implementation instances and/or the superclass instance."
: ImplStaticMembersExtendable<Super, AllTraits> extends false : ImplStaticMembersExtendable<Superclass, AllTraits> extends false
? "Type conflict between the traits implementation static members and/or the superclass static members." ? "Type conflict between the traits implementation static members and/or the superclass static members."
: TraitExpression<Super, OwnTraits, AllTraits> : TraitExpression<Superclass, OwnTraits, AllTraits>
) )

View File

@@ -57,7 +57,7 @@ const builder = expression
StatefulSubscription, StatefulSubscription,
) )
type T = TraitExpression.OwnTraits<typeof builder.expression> type T = TraitExpression.AllTraits<typeof builder.expression>
const exp = builder.get() const exp = builder.get()
type Abs = Implements<typeof exp> type Abs = Implements<typeof exp>