From 62b1a57cea4b576fd1c7aec2604eedaf1770b466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 12 May 2024 01:06:44 +0200 Subject: [PATCH] Working effect schema mutability --- src/effect/EffectSchemaTraitExpression.ts | 31 +++++--- .../EffectSchemaTraitExpressionBuilder.ts | 75 ++++++++++++------- src/effect/tests.ts | 19 +---- 3 files changed, 74 insertions(+), 51 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 1cdb9d6..a3d29ca 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -6,28 +6,33 @@ import { Extend, StaticMembers } from "../util" export class EffectSchemaTraitExpression< - Fields extends S.Struct.Fields, + Fields extends S.Struct.Fields, I, R, C, - Inherited extends object, + Inherited extends object, Proto, - Static extends object, + Static extends object, - const Traits extends readonly Trait[], + const Traits extends readonly Trait[], + + const Mutability extends "Immutable" | "Mutable", + const EncodedMutability extends "Immutable" | "Mutable", > implements TraitExpressionLike< S.Class, Traits > { constructor( - readonly superclass: S.Class, - readonly superclassStatic: Static, - readonly traits: Traits, + readonly superclass: S.Class, + readonly superclassStatic: Static, + readonly traits: Traits, + readonly mutability: Mutability, + readonly encodedMutability: EncodedMutability, ) {} extends(): ( AbstractConstructor< - S.Struct.Type & + ApplyMutability, Mutability> & Omit & Proto, @@ -38,7 +43,8 @@ implements TraitExpressionLike< S.Class< Self, Fields, - I, R, C, + ApplyMutability, + R, C, Simplify< Extend<[ Inherited, @@ -69,3 +75,10 @@ implements TraitExpressionLike< return (_target: StaticImplements) => {} } } + + +type ApplyMutability = ( + Mutability extends "Immutable" + ? { +readonly [P in keyof T]: T[P] } + : { -readonly [P in keyof T]: T[P] } +) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 6918b16..a8d6f4c 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,5 +1,4 @@ import { Schema as S } from "@effect/schema" -import * as Types from "effect/Types" import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" @@ -22,6 +21,8 @@ export class EffectSchemaInitialTraitExpressionBuilder { S.Class(identifier)(fields, annotations), {}, [], + "Immutable", + "Immutable", ) } @@ -37,6 +38,8 @@ export class EffectSchemaInitialTraitExpressionBuilder { S.TaggedClass()(tag, fields, annotations), {}, [], + "Immutable", + "Immutable", ) } @@ -65,56 +68,71 @@ export class EffectSchemaInitialTraitExpressionBuilder { >, [], + "Immutable", + "Immutable", ) } } export class EffectSchemaTraitExpressionBuilder< - Fields extends S.Struct.Fields, + Fields extends S.Struct.Fields, I, R, C, - Inherited extends object, + Inherited extends object, Proto, - Static extends object, + Static extends object, - const Traits extends readonly Trait[], + const Traits extends readonly Trait[], + + const Mutability extends "Immutable" | "Mutable", + const EncodedMutability extends "Immutable" | "Mutable", > { constructor( - readonly expressionSuperclass: S.Class, - readonly expressionSuperclassStatic: Static, - readonly expressionTraits: Traits, + readonly expressionSuperclass: S.Class, + readonly expressionSuperclassStatic: Static, + readonly expressionTraits: Traits, + readonly expressionMutability: Mutability, + readonly expressionEncodedMutability: EncodedMutability, ) {} - // mutable() { - // return new EffectSchemaTraitExpressionBuilder( - // this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, - // this.expressionSuperclassStatic, - // this.expressionTraits, - // ) - // } + mutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass, + this.expressionSuperclassStatic, + this.expressionTraits, + "Mutable", + this.expressionEncodedMutability, + ) + } - // immutable() { - // return new EffectSchemaTraitExpressionBuilder( - // this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, - // this.expressionSuperclassStatic, - // this.expressionTraits, - // ) - // } + immutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass, + this.expressionSuperclassStatic, + this.expressionTraits, + "Immutable", + this.expressionEncodedMutability, + ) + } mutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass, this.expressionSuperclassStatic, this.expressionTraits, + this.expressionMutability, + "Mutable", ) } immutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass, this.expressionSuperclassStatic, this.expressionTraits, + this.expressionMutability, + "Immutable", ) } @@ -140,6 +158,9 @@ export class EffectSchemaTraitExpressionBuilder< ...this.expressionTraits, ...spreadSupertraits(traits), ]) as TraitExpressionBuilder.ExpressesReturnTypeTraits, + + this.expressionMutability, + this.expressionEncodedMutability, ) } @@ -166,13 +187,17 @@ export class EffectSchemaTraitExpressionBuilder< Proto, Static, - Traits + Traits, + Mutability, + EncodedMutability > ) { return new EffectSchemaTraitExpression( this.expressionSuperclass, this.expressionSuperclassStatic, this.expressionTraits, + this.expressionMutability, + this.expressionEncodedMutability, ) as any } } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index c51f12f..5052c90 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -8,21 +8,6 @@ type RequiredKeys = { [K in keyof T]-?: {} extends Pick ? never : K }[keyof T] -type Extr = - T extends EffectSchemaTraitExpression< - infer Fields, - infer I, - infer R, - infer C, - infer Inherited, - infer Proto, - infer Static, - - infer Traits - > - ? Static - : never - type InspectSchemaClass = T extends S.Class ? Inherited : never @@ -33,7 +18,7 @@ const userExp = effectSchemaExpression id: S.BigIntFromSelf, role: S.Union(S.Literal("User"), S.Literal("Admin")), }) - // .mutable() + .mutable() .mutableEncoded() .build() @@ -46,7 +31,7 @@ export class User extends userExp.extends() implements Implements