diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 7f5dc9e..96a3b5c 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -8,7 +8,10 @@ import { Extend } from "../util" export class EffectSchemaTraitExpression< Superclass extends S.Class, Fields extends S.Struct.Fields, - A, I, R, C, + A, + I, + R, + C, Inherited extends object, Proto, @@ -24,7 +27,10 @@ export class EffectSchemaTraitExpression< S.Class< Self, Fields, - A, I, R, C, + A, + I, + R, + C, Simplify< Extend<[ Inherited, diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 051e0cb..fd9d063 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,14 +1,84 @@ import { Schema as S } from "@effect/schema" +import { Simplify } from "effect/Types" import { Trait } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" import { spreadSupertraits } from "../spreadSupertraits" import { traitsUnique } from "../traitsUnique" +import { StaticMembers } from "../util" + + +export class EffectSchemaInitialTraitExpressionBuilder { + class< + Fields extends S.Struct.Fields + >( + identifier: string, + fields: Fields, + annotations?: S.Annotations.Schema, + ) { + return new EffectSchemaTraitExpressionBuilder( + S.Class(identifier)(fields, annotations), + [], + ) + } + + taggedClass< + Tag extends string, + Fields extends S.Struct.Fields, + >( + tag: Tag, + fields: Fields, + annotations?: S.Annotations.Schema, + ) { + return new EffectSchemaTraitExpressionBuilder( + S.TaggedClass()(tag, fields, annotations), + [], + ) + } + + extends< + Super extends S.Class, + + Fields extends S.Struct.Fields, + A, + I, + R, + C, + Inherited extends object, + Proto, + + NewFields extends S.Struct.Fields, + >( + superclass: Super | S.Class, + identifier: string, + fields: NewFields, + annotations?: S.Annotations.Schema, + ) { + return new EffectSchemaTraitExpressionBuilder< + Fields & NewFields, + Simplify>, + Simplify>, + R | S.Struct.Context, + Simplify>, + InstanceType, + Proto, + StaticMembers, + + readonly [] + >( + superclass.extend(identifier)(fields, annotations) as any, + [], + ) + } +} export class EffectSchemaTraitExpressionBuilder< Fields extends S.Struct.Fields, - A, I, R, C, + A, + I, + R, + C, Inherited extends object, Proto, Static extends object, @@ -21,42 +91,6 @@ export class EffectSchemaTraitExpressionBuilder< ) {} - class( - identifier: string, - fields: NewFields, - annotations?: S.Annotations.Schema - ) { - return new EffectSchemaTraitExpressionBuilder( - S.Class(identifier)(fields, annotations), - this.expressionTraits, - ) - } - - - extends< - Super extends S.Class, - - SuperFields extends S.Struct.Fields, - SuperA, SuperI, SuperR, SuperC, - SuperInherited extends object, - SuperProto, - >( - superclass: Super | S.Class - ) { - return new EffectSchemaTraitExpressionBuilder< - Super, - Traits, - - SuperFields, - SuperA, SuperI, SuperR, SuperC, - SuperInherited, - SuperProto - >( - superclass as Super, - this.expressionTraits, - ) - } - expresses< const T extends readonly Trait< TraitExpression< @@ -71,7 +105,10 @@ export class EffectSchemaTraitExpressionBuilder< ...traits: T ): EffectSchemaTraitExpressionBuilder< Fields, - A, I, R, C, + A, + I, + R, + C, Inherited, Proto, Static, @@ -88,3 +125,6 @@ export class EffectSchemaTraitExpressionBuilder< ) } } + + +export const effectSchemaExpression = new EffectSchemaInitialTraitExpressionBuilder()