From ff3991ae454eddaf9df3d8a37a4dec5a4fcc8ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 31 Jan 2024 03:22:23 +0100 Subject: [PATCH] Working trait expression implements --- bun.lockb | Bin 155966 -> 155678 bytes src/expresses.ts | 30 +++++++++++++++++++----------- src/tests.ts | 31 ++++++++----------------------- src/trait.ts | 10 +++++----- src/util/extend.ts | 16 ++++++++++++++++ src/util/index.ts | 2 +- src/util/trait.ts | 22 ---------------------- 7 files changed, 49 insertions(+), 62 deletions(-) delete mode 100644 src/util/trait.ts diff --git a/bun.lockb b/bun.lockb index 3bf296d63c0a969426dbea7d9fd89377daa85799..c3c0b09247cff1be9abe12a541d885a7f62b184f 100755 GIT binary patch delta 1249 zcmXZbOGs2v9LMo!(y%&2UUHQ7TV!nB~N zM8h7MwP{n=MTiIy?cLQ%jf$dGi-@4U|C!&P`E!2fbI;s+&K;eY3J*<&`)bm9>$_`T z*ZR(W-;j9U@9W}sU8;_H=lHlZx>43Bo5#FK)+C$HyxJC1&9ZdzKD!CkB3nS-FKd-$ zU^OX=yJNx-ct8u=WMS-}?6@p~70FJ>GO=RWNm&%Dl(owiVrjBdNsBv|1^%I}I#ZgtFyAjy$0Q-o%CH8STbP>0#LgEsSBe zWnHpmSQXh$c~Q2UoS}7>7;V!l=x?+g=(5(WB!8!^;@!eLCO?wo+!fg><{xEOWviJ_ z%dW}RFn>$76J3|BB~QqD80~QRbd+p$Gi7mCz~mQgyXpn)`a1e2ZJV-_o2{p3XsbTi z2J#28ZJ=Mak^F^h8@R)04=$vq$yWCm?ageWvpm0lKH)xS*Nfsy=0c|xZJ6y?RJW0+y7w%vl$ht!WqtO3sl9`Vwjo~_gcAN%diW61O1A{ngFeqkItEj##zz8HwTB~LZIjfV*!Gd+LMo&pz7qAEN1TOaK4? delta 1534 zcmbW1*>6l?7{+EPm`ElSm1RZH!(5{YW#f(waBx^lr?uOuhp56~(ts>Ox2 zu~Z|NTGBLwAa*K|a77!DiYpf)5`OQ@^AGUmJaeA+_igWY=6t7PAlM%ZHkK##M2=M4 ztneC|y!Wk-n!HLs*(IXNbB@a;p)q3BVx!2nSp!icHX7d?C(hN1*<96Pbz(MGjaa={ z3VAIe_1%7c$B_ikN@VLahz0Rg$OVzy4XSaY2D z&ZPo(3Z78MG}tb&lVamx`C=_%>97K^RIuyv0RzoQ6Lp)+sg} zR*bh@c8Sfvr>I{ycPn}(`ig8rm((u@KY}bSCz$VYNxsFAb63=H7WoIUt75as2gQ2C z=8)gR+m5b@<>C9qdb!)?=Atm(;)d8f{14tgmxJj8T6;eFj&jj$vHAE<$l{Jz0saZz z3b-q_0RIJV1z1tG@Io|*w;14VPi7HH#amG^A7kx{QJUa=u_dr{u?J#HVVPnNx!cKD zh6a$uWA!V<_r^)0P+NF8`c1pVQ}y$UNdAym_0I%X;KPhC_FSwO{}FFHdLd@V)m}_1 z{-xL|d=}mceI>RUA4L|g#n#~aIAn47MzDk|i-oPyw_ZA$$DR_D(Ed z=Z}bVL=Uuh*OPtw!dQj&0oje}Q5~|CZ895d6Rk%Z&_=WgZAM$rR#b}0(0`06{P#i8 zyt7`m7izQvO}y`lZg2Mv215ZmRK(t)XspxA^#VMictl6KyvmYL_fVoef4H^mvlk2P P8BXM#k!Z${7e4$Km5zyO diff --git a/src/expresses.ts b/src/expresses.ts index d8dbe4c..fed933a 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -1,6 +1,7 @@ -import { AbstractClass, Opaque } from "type-fest" -import { Trait, TraitApplierSuperTag } from "." -import { MergeInheritanceTree, TraitsAbstractMembers } from "./util" +import { Fn, Pipe, Tuples } from "hotscript" +import { AbstractClass, Opaque, Simplify } from "type-fest" +import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag } from "." +import { ExtendFn } from "./util" class TraitsExpression< @@ -12,14 +13,6 @@ class TraitsExpression< readonly traits: Traits, ) {} - implements(): ( - MergeInheritanceTree< - TraitsAbstractMembers - > - ) { - return {} as any - } - extends() { return this.traits.reduce( (previous, trait) => trait.apply(previous), @@ -29,6 +22,21 @@ class TraitsExpression< } +interface SimplifyFn extends Fn { + return: Simplify +} + +export type Implements> = ( + Exp extends TraitsExpression + ? Pipe, + ExtendFn, + SimplifyFn, + ]> + : never +) + + export function extendsAndExpresses< Super extends AbstractClass, Traits extends readonly Trait[], diff --git a/src/tests.ts b/src/tests.ts index 39aece7..104d0fe 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,7 +1,4 @@ -import { Simplify } from "type-fest" -import { GetTraitAbstractMembers, GetTraitClass, GetTraitImplClass, GetTraitImplInstance, GetTraitInstance, Trait, TraitAbstractMembers, TraitImplInstance, expresses, trait } from "." -import { MergeInheritanceTree, TraitsAbstractMembers } from "./util" -import { Call, Fn, Tuples } from "hotscript" +import { Implements, TraitAbstractMembers, expresses, trait } from "." const PrintsHelloOnNew = trait()(Super => @@ -41,28 +38,16 @@ const ActiveStatefulSubscription = trait>>> -type Test1 = [ - TraitAbstractMembers, - TraitAbstractMembers, -] -type Test2 = TraitsAbstractMembers<[ - typeof StatefulSubscription, - typeof ActiveStatefulSubscription, -]> -type Test3 = Simplify< - Call, [ - typeof StatefulSubscription, - typeof ActiveStatefulSubscription, - ]> -> + // type Test2 = Simplify> -const appliedIdentifiable = Identifiable().apply({} as any) +const exp = expresses( + Identifiable(), + // Identifiable() +) +type Impl = Implements -const exp = expresses(Identifiable(), Identifiable()) - -class User implements ReturnType { +class User implements Implements { id: bigint = -1n } diff --git a/src/trait.ts b/src/trait.ts index a73f4d1..a8b758e 100644 --- a/src/trait.ts +++ b/src/trait.ts @@ -57,7 +57,7 @@ export type TraitAbstractMembers = ( : never ) -export interface GetTraitAbstractMembers extends Fn { +export interface TraitAbstractMembersFn extends Fn { return: TraitAbstractMembers } @@ -70,7 +70,7 @@ export type TraitImplClass = ( : never ) -export interface GetTraitImplClass extends Fn { +export interface TraitImplClassFn extends Fn { return: TraitImplClass } @@ -83,7 +83,7 @@ export type TraitImplInstance = ( : never ) -export interface GetTraitImplInstance extends Fn { +export interface TraitImplInstanceFn extends Fn { return: TraitImplInstance } @@ -93,7 +93,7 @@ export type TraitClass = ( : never ) -export interface GetTraitClass extends Fn { +export interface TraitClassFn extends Fn { return: TraitClass } @@ -103,7 +103,7 @@ export type TraitInstance = ( : never ) -export interface GetTraitInstance extends Fn { +export interface TraitInstanceFn extends Fn { return: TraitInstance } diff --git a/src/util/extend.ts b/src/util/extend.ts index e69de29..c36ae4e 100644 --- a/src/util/extend.ts +++ b/src/util/extend.ts @@ -0,0 +1,16 @@ +import { Call, Fn, Tuples } from "hotscript" + + +type CommonKeys = Extract + +type ExtendReducer = ( + Pick> extends Pick> + ? Omit> & Self + : never +) +interface ExtendReducerFn extends Fn { + return: ExtendReducer +} + +export type ExtendFn = Tuples.Reduce +export type Extend = Call diff --git a/src/util/index.ts b/src/util/index.ts index c5faea6..bf58ac1 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,3 +1,3 @@ export * from "./class" +export * from "./extend" export * from "./inheritance" -export * from "./trait" diff --git a/src/util/trait.ts b/src/util/trait.ts deleted file mode 100644 index 83153cd..0000000 --- a/src/util/trait.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Trait, TraitAbstractMembers, TraitClass } from ".." - - -export type TraitsAbstractMembers[]> = ( - Traits extends [infer T, ...infer Rest] - ? T extends Trait - ? Rest extends Trait[] - ? [TraitAbstractMembers, ...TraitsClasses] - : never - : never - : [] -) - -export type TraitsClasses[]> = ( - Traits extends [infer T, ...infer Rest] - ? T extends Trait - ? Rest extends Trait[] - ? [TraitClass, ...TraitsClasses] - : never - : never - : [] -)