This commit is contained in:
@@ -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, [
|
||||||
|
|||||||
22
src/tests.ts
22
src/tests.ts
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
src/trait.ts
13
src/trait.ts
@@ -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"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user