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 31 additions and 42 deletions
Showing only changes of commit f6d2d68eee - Show all commits

View File

@@ -1,6 +1,6 @@
import { Call, Fn, Pipe, Tuples } from "hotscript" import { Call, ComposeLeft, Fn, Pipe, Tuples } from "hotscript"
import { AbstractClass, Class, Opaque } from "type-fest" import { AbstractClass, Class, Opaque } from "type-fest"
import { AbstractTag, Trait, TraitAbstractFn, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, TraitSupertraitsFn } from "." import { AbstractTag, Trait, TraitApplierSuperTag, TraitOwnAbstractFn, TraitOwnImplClassFn, TraitOwnImplInstanceFn, TraitSupertraitsFn } from "."
import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util" import { ExtendFn, ExtendableFn, SimplifyFn, StaticMembersFn } from "./util"
@@ -48,10 +48,10 @@ export class TraitExpression<
SubtraitImplWithAbstract extends Class<{}>, SubtraitImplWithAbstract extends Class<{}>,
>( >(
abstract: ( abstract: (
abstract: Pipe<Traits, [ abstract: Call<
Tuples.Map<TraitOwnAbstractFn>, ComposeLeft<[TraitExpressionAbstractFn, SimplifyFn]>,
SimplifyFn, typeof this
]> >
) => Opaque<SubtraitAbstract, AbstractTag>, ) => Opaque<SubtraitAbstract, AbstractTag>,
// impl: () // impl: ()
@@ -77,33 +77,15 @@ export interface TraitExpressionTraitsFn extends Fn {
} }
export interface TraitExpressionAbstractFn extends Fn { export interface TraitExpressionAbstractFn extends Fn {
return: this["arg0"] extends TraitExpression<any, infer Traits> return: this["arg0"] extends TraitExpression<any, any>
? Pipe<Traits, [ ? Pipe<this["arg0"], [
TraitAbstractFn, TraitExpressionTraitsFn,
Tuples.Map<TraitOwnAbstractFn>,
ExtendFn, ExtendFn,
]> ]>
: never : never
} }
export interface TraitExpressionInstanceFn extends Fn {
return: this["arg0"] extends TraitExpression<infer Super, infer Traits>
? Pipe<Traits, [
TraitAbstractFn,
ExtendFn,
]>
: never
}
export interface TraitExpressionStaticFn extends Fn {
return: this["arg0"] extends TraitExpression<infer Super, infer Traits>
? Pipe<Traits, [
TraitAbstractFn,
ExtendFn,
]>
: never
}
export type Implements<Exp extends TraitExpression<any, any>> = ( export type Implements<Exp extends TraitExpression<any, any>> = (
Exp extends TraitExpression<any, infer Traits> Exp extends TraitExpression<any, infer Traits>
? Pipe<Traits, [ ? Pipe<Traits, [

View File

@@ -1,5 +1,7 @@
import { Call } from "hotscript" import { Call, ComposeLeft, Pipe } from "hotscript"
import { Implements, TraitExpressionTraitsFn, abstract, expression, trait } from "." import { Implements, TraitExpressionAbstractFn, TraitExpressionTraitsFn, abstract, expression, trait } from "."
import { Simplify } from "type-fest"
import { SimplifyFn } from "./util"
const PrintsHelloOnNew = trait( const PrintsHelloOnNew = trait(
@@ -59,9 +61,23 @@ const builder = expression
) )
const exp = builder.get() const exp = builder.get()
type Abs = Call<TraitExpressionTraitsFn, typeof exp> type Abs = Call<ComposeLeft<[
TraitExpressionAbstractFn,
SimplifyFn,
]>, typeof exp>
exp.subtrait(
s => {
interface Subtrait extends (typeof s) {
}
return abstract<Subtrait>()
},
)
class User extends exp.extends implements Implements<typeof exp> { class User extends exp.extends implements Implements<typeof exp> {
declare status: { _tag: "awaitingPayment" } | { _tag: "active"; activeSince: Date; expiresAt?: Date | undefined } | { _tag: "expired"; expiredSince: Date }
id: bigint = -1n id: bigint = -1n
} }

View File

@@ -1,7 +1,7 @@
import { Call, Fn } from "hotscript" import { Call, Fn } from "hotscript"
import { AbstractClass, Class, Opaque } from "type-fest" import { AbstractClass, Class, Opaque } from "type-fest"
import { AbstractTag, TraitExpression, TraitExpressionAbstractFn, TraitExpressionNullSuperclass, TraitExpressionTraitsFn, emptyTraitExpression } from "." import { AbstractTag, TraitExpression, TraitExpressionNullSuperclass, TraitExpressionTraitsFn, emptyTraitExpression } from "."
import { ExtendFn, StaticMembers } from "./util" import { StaticMembers } from "./util"
type AddAbstractToImplClass< type AddAbstractToImplClass<
@@ -83,15 +83,6 @@ export interface TraitSupertraitsFn extends Fn {
: never : never
} }
export interface TraitAbstractFn extends Fn {
return: this["arg0"] extends Trait<infer Super, infer Abstract, any>
? Call<ExtendFn, [
...Call<TraitExpressionAbstractFn, Super>,
Abstract,
]>
: never
}
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper" export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"