From 4e5cd07ef31543e116ae574118f23e53072c2d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 17:31:59 +0200 Subject: [PATCH] Effect work --- src/effect/EffectSchemaTraitExpression.ts | 13 ++++--- .../EffectSchemaTraitExpressionBuilder.ts | 37 ++++++++++++++++++- src/effect/tests.ts | 27 ++++++-------- 3 files changed, 55 insertions(+), 22 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 96a3b5c..95b978f 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -6,7 +6,6 @@ import { Extend } from "../util" export class EffectSchemaTraitExpression< - Superclass extends S.Class, Fields extends S.Struct.Fields, A, I, @@ -14,11 +13,12 @@ export class EffectSchemaTraitExpression< C, Inherited extends object, Proto, + Static extends object, const Traits extends readonly Trait[], > { constructor( - readonly superclass: Superclass, + readonly superclass: S.Class & Static, readonly traits: Traits, ) {} @@ -41,7 +41,10 @@ export class EffectSchemaTraitExpression< > & Simplify< - Extend> + Extend<[ + Static, + ...TraitTuple.MapImplStaticMembers + ]> > ) { return this.traits.reduce( @@ -51,9 +54,9 @@ export class EffectSchemaTraitExpression< } - staticImplements(_target: StaticImplements>, _context: any) {} + staticImplements(_target: StaticImplements>, _context: any) {} get staticImplementsStage2() { - return (_target: StaticImplements>) => {} + return (_target: StaticImplements>) => {} } } diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index fd9d063..afa83db 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,11 +1,12 @@ import { Schema as S } from "@effect/schema" import { Simplify } from "effect/Types" -import { Trait } from "../Trait" +import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" import { spreadSupertraits } from "../spreadSupertraits" import { traitsUnique } from "../traitsUnique" -import { StaticMembers } from "../util" +import { Extendable, StaticMembers } from "../util" +import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression" export class EffectSchemaInitialTraitExpressionBuilder { @@ -124,6 +125,38 @@ export class EffectSchemaTraitExpressionBuilder< ]), ) } + + + build(): ( + Extendable> extends false + ? "Type conflict between the traits abstract definitions." + : Extendable> extends false + ? "Type conflict between the traits static abstract definitions." + : Extendable<[ + InstanceType, + ...TraitTuple.MapImplInstance, + ]> extends false + ? "Type conflict between the traits implementation instance and/or the superclass instance." + : Extendable<[ + Static, + ...TraitTuple.MapImplStaticMembers, + ]> extends false + ? "Type conflict between the traits implementation static members and/or the superclass static members." + : EffectSchemaTraitExpression< + Fields, + A, + I, + R, + C, + Inherited, + Proto, + Static, + + Traits + > + ) { + return new EffectSchemaTraitExpression(this.expressionSuperclass, this.expressionTraits) as any + } } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 2c653c9..7d6593f 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -1,30 +1,27 @@ import { Schema as S } from "@effect/schema" import { Implements } from "../TraitExpression" -import { expression } from "../TraitExpressionBuilder" -import { extendsEffectSchemaExpression } from "../effect" +import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" -const UserSchema = S.Class("User")({ - id: S.BigIntFromSelf -}) - -const userExp = expression - .extends(UserSchema) +const userExp = effectSchemaExpression + .class("User", { + id: S.BigIntFromSelf, + role: S.Union(S.Literal("User"), S.Literal("Admin")), + }) .build() @userExp.staticImplements -class User extends extendsEffectSchemaExpression(userExp)() implements Implements { +class User extends userExp.extends() implements Implements { static aStaticMethodThatShouldBeInherited() {} } -const AdminSchema = User.extend("Admin")({ -}) - -const adminExp = expression - .extends(AdminSchema) +const adminExp = effectSchemaExpression + .extends(User, "User", { + role: S.Literal("Admin") + }) .build() @adminExp.staticImplements -class Admin extends extendsEffectSchemaExpression(adminExp)() implements Implements { +class Admin extends adminExp.extends() implements Implements { }