diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts new file mode 100644 index 0000000..7f5dc9e --- /dev/null +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -0,0 +1,53 @@ +import { Schema as S } from "@effect/schema" +import { Simplify } from "type-fest" +import { Trait, TraitTuple } from "../Trait" +import { StaticImplements, TraitExpression } from "../TraitExpression" +import { Extend } from "../util" + + +export class EffectSchemaTraitExpression< + Superclass extends S.Class, + Fields extends S.Struct.Fields, + A, I, R, C, + Inherited extends object, + Proto, + + const Traits extends readonly Trait[], +> { + constructor( + readonly superclass: Superclass, + readonly traits: Traits, + ) {} + + + extends(): ( + S.Class< + Self, + Fields, + A, I, R, C, + Simplify< + Extend<[ + Inherited, + ...TraitTuple.MapImplInstance + ]> + >, + Proto + > & + + Simplify< + Extend> + > + ) { + return this.traits.reduce( + (previous, trait) => trait.apply(previous), + this.superclass, + ) as any + } + + + staticImplements(_target: StaticImplements>, _context: any) {} + + get staticImplementsStage2() { + return (_target: StaticImplements>) => {} + } +}