0.1.0 #1

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

View File

@@ -1,6 +1,6 @@
import { Call, Fn } from "hotscript" import { Fn } from "hotscript"
import { AbstractClass, Class, Opaque } from "type-fest" import { AbstractClass, Class, Opaque } from "type-fest"
import { AbstractTag, TraitExpression, TraitExpressionNullSuperclass, TraitExpressionTraitsFn, emptyTraitExpression } from "." import { AbstractTag, TraitExpression, TraitExpressionAllTraits, TraitExpressionNullSuperclass, emptyTraitExpression } from "."
import { StaticMembers } from "./util" import { StaticMembers } from "./util"
@@ -33,9 +33,9 @@ export class Trait<
ImplClass extends Class<{}, []>, ImplClass extends Class<{}, []>,
> { > {
constructor( constructor(
readonly superExpression: Super, readonly supertraits: Super,
readonly abstract: Abstract, readonly abstract: Abstract,
readonly apply: (Super: AbstractClass<{}>) => ImplClass, readonly apply: (Super: AbstractClass<{}>) => ImplClass,
) {} ) {}
} }
@@ -87,10 +87,13 @@ export interface TraitOwnInstanceFn extends Fn {
} }
export interface TraitSupertraitsFn extends Fn { export type TraitSupertraits<T> = (
return: this["arg0"] extends Trait<infer Super, any, any> T extends Trait<infer Super, any, any>
? Call<TraitExpressionTraitsFn, Super> ? TraitExpressionAllTraits<Super>
: never : never
)
export interface TraitSupertraitsFn extends Fn {
return: TraitSupertraits<this["arg0"]>
} }

View File

@@ -1,7 +1,7 @@
import { Call, ComposeLeft, Fn, Pipe, Tuples } from "hotscript" import { Call, Fn, Pipe, Tuples } from "hotscript"
import { AbstractClass, Class, Opaque } from "type-fest" import { AbstractClass, Class, Opaque } from "type-fest"
import { AbstractTag, Trait, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, TraitSupertraitsFn } from "." import { AbstractTag, Trait, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn } from "."
import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util" import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util"
export class TraitExpressionNullSuperclass {} export class TraitExpressionNullSuperclass {}
@@ -39,7 +39,7 @@ export class TraitExpression<
SimplifyFn, SimplifyFn,
]> ]>
) { ) {
return this.ownTraits.reduce( return this.allTraits.reduce(
(previous, trait) => trait.apply(previous), (previous, trait) => trait.apply(previous),
this.superclass as Opaque<Super, TraitApplierSuperTag>, this.superclass as Opaque<Super, TraitApplierSuperTag>,
) as any ) as any
@@ -50,10 +50,9 @@ export class TraitExpression<
SubtraitImplWithAbstract extends Class<{}>, SubtraitImplWithAbstract extends Class<{}>,
>( >(
abstract: ( abstract: (
abstract: Call< abstract: Pipe<typeof this, [
ComposeLeft<[TraitExpressionAbstractFn, SimplifyFn]>,
typeof this ]>
>
) => Opaque<SubtraitAbstract, AbstractTag>, ) => Opaque<SubtraitAbstract, AbstractTag>,
// impl: () // impl: ()
@@ -62,42 +61,47 @@ export class TraitExpression<
} }
} }
export const emptyTraitExpression = new TraitExpression( export type TraitExpressionSuper<T> = (
TraitExpressionNullSuperclass, T extends TraitExpression<infer Super, any, any>
[] as const, ? Super
[] as const, : never
) )
export interface TraitExpressionSuperFn extends Fn {
interface PrependTraitSupertraitsFn extends Fn { return: TraitExpressionSuper<this["arg0"]>
return: this["arg0"] extends Trait<any, any, any>
? [
...Call<TraitSupertraitsFn, this["arg0"]>,
this["arg0"],
]
: never
}
export interface TraitExpressionTraitsFn extends Fn {
return: this["arg0"] extends TraitExpression<any, infer Traits>
? Call<Tuples.FlatMap<PrependTraitSupertraitsFn>, Traits>
: never
} }
export interface TraitExpressionAbstractFn extends Fn { export type TraitExpressionOwnTraits<T> = (
return: this["arg0"] extends TraitExpression<any, any> T extends TraitExpression<any, infer OwnTraits, any>
? Pipe<this["arg0"], [ ? OwnTraits
TraitExpressionTraitsFn,
Tuples.Map<TraitOwnAbstractFn>,
ExtendFn,
]>
: never : never
)
export interface TraitExpressionOwnTraitsFn extends Fn {
return: TraitExpressionOwnTraits<this["arg0"]>
} }
export type Implements<Exp extends TraitExpression<any, any>> = ( export type TraitExpressionAllTraits<T> = (
Exp extends TraitExpression<any, infer Traits> T extends TraitExpression<any, any, infer AllTraits>
? Pipe<Traits, [ ? AllTraits
: never
)
export interface TraitExpressionAllTraitsFn extends Fn {
return: TraitExpressionAllTraits<this["arg0"]>
}
export type Implements<Exp extends TraitExpression<any, any, any>> = (
Exp extends TraitExpression<any, infer AllTraits, any>
? Pipe<AllTraits, [
Tuples.Map<TraitOwnAbstractFn>, Tuples.Map<TraitOwnAbstractFn>,
ExtendFn, ExtendFn,
SimplifyFn, SimplifyFn,
]> ]>
: never : never
) )
export const emptyTraitExpression = new TraitExpression(
TraitExpressionNullSuperclass,
[] as const,
[] as const,
)

View File

@@ -1,6 +1,6 @@
import { Call, Fn, Pipe, Tuples } from "hotscript" import { Call, Fn, Pipe, Tuples } from "hotscript"
import { AbstractClass } from "type-fest" import { AbstractClass } from "type-fest"
import { Trait, TraitExpression, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, TraitSupertraitsFn, emptyTraitExpression } from "." import { Trait, TraitExpression, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, emptyTraitExpression } from "."
import { ExtendableFn, StaticMembersFn } from "./util" import { ExtendableFn, StaticMembersFn } from "./util"
@@ -27,17 +27,18 @@ class TraitExpressionBuilder<
Traits extends Trait<any, any, any>[] Traits extends Trait<any, any, any>[]
>( >(
...traits: Traits ...traits: Traits
) { ): TraitExpressionBuilder<
Super,
[...OwnTraits, ...Traits],
[...AllTraits, SpreadSupertraits<Traits>]
> {
return new TraitExpressionBuilder( return new TraitExpressionBuilder(
new TraitExpression( new TraitExpression(
this.expression.superclass, this.expression.superclass,
[...this.expression.ownTraits, ...traits] as const, [...this.expression.ownTraits, ...traits] as const,
[ [...this.expression.allTraits, ...this.spreadSupertraits(traits)] as const,
...this.expression.allTraits,
...this.spreadSupertraits(traits) as SpreadTraitsHierarchy<Traits>,
] as const,
) )
) ) as any
} }
private spreadSupertraits< private spreadSupertraits<
@@ -50,9 +51,9 @@ class TraitExpressionBuilder<
traits: Traits traits: Traits
) { ) {
return traits.flatMap(trait => [ return traits.flatMap(trait => [
...trait.superExpression.allTraits, ...trait.supertraits.allTraits,
trait, trait,
]) ]) as SpreadSupertraits<Traits>
} }
get() { get() {
@@ -65,18 +66,17 @@ class TraitExpressionBuilder<
} }
type SpreadTraitsHierarchy<Traits extends Trait<any, any, any>[]> = ( type SpreadSupertraits<Traits extends Trait<any, any, any>[]> = (
Call< Call<
Tuples.FlatMap<PrependTraitSupertraitsFn>, Tuples.FlatMap<PrependTraitSupertraitsFn>,
Traits Traits
> >
) )
interface PrependTraitSupertraitsFn extends Fn { interface PrependTraitSupertraitsFn extends Fn {
return: this["arg0"] extends Trait<any, any, any> return: this["arg0"] extends Trait<infer Super, any, any>
? [ ? Super extends TraitExpression<any, any, infer AllTraits>
...Call<TraitSupertraitsFn, this["arg0"]>, ? [...AllTraits, this["arg0"]]
this["arg0"], : never
]
: never : never
} }

View File

@@ -1,6 +1,4 @@
import { Call, ComposeLeft } from "hotscript" import { Implements, abstract, expression, trait } from "."
import { Implements, TraitExpressionAbstractFn, abstract, expression, trait } from "."
import { SimplifyFn } from "./util"
const PrintsHelloOnNew = trait( const PrintsHelloOnNew = trait(
@@ -60,10 +58,7 @@ const builder = expression
) )
const exp = builder.get() const exp = builder.get()
type Abs = Call<ComposeLeft<[ type Abs = Implements<typeof exp>
TraitExpressionAbstractFn,
SimplifyFn,
]>, typeof exp>
// exp.subtrait( // exp.subtrait(
// s => { // s => {