import { Schema as S } from "@effect/schema" import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { StaticImplements, TraitExpressionLike } from "../TraitExpression" import { Extend } from "../util" export class EffectSchemaTraitExpression< Fields extends S.Struct.Fields, A, I, R, C, Inherited extends object, Proto, Static extends object, const Traits extends readonly Trait[], > implements TraitExpressionLike< S.Class, Traits > { constructor( readonly superclass: S.Class, readonly superclassStatic: Static, readonly traits: Traits, ) {} extends(): ( S.Class< Self, Fields, A, I, R, C, Simplify< Extend<[ Inherited, ...TraitTuple.MapImplInstance ]> >, Proto > & Simplify< Extend<[ Static, ...TraitTuple.MapImplStaticMembers ]> > ) { return this.traits.reduce( (previous, trait) => trait.apply(previous), this.superclass, ) as any } staticImplements(_target: StaticImplements, _context: any) {} get staticImplementsStage2() { return (_target: StaticImplements) => {} } }