Effect work
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Julien Valverdé
2024-05-09 17:31:59 +02:00
parent b092fdef58
commit 4e5cd07ef3
3 changed files with 55 additions and 22 deletions

View File

@@ -6,7 +6,6 @@ import { Extend } from "../util"
export class EffectSchemaTraitExpression< export class EffectSchemaTraitExpression<
Superclass extends S.Class<unknown, Fields, A, I, R, C, Inherited, Proto>,
Fields extends S.Struct.Fields, Fields extends S.Struct.Fields,
A, A,
I, I,
@@ -14,11 +13,12 @@ export class EffectSchemaTraitExpression<
C, C,
Inherited extends object, Inherited extends object,
Proto, Proto,
Static extends object,
const Traits extends readonly Trait<any, any, any, any>[], const Traits extends readonly Trait<any, any, any, any>[],
> { > {
constructor( constructor(
readonly superclass: Superclass, readonly superclass: S.Class<unknown, Fields, A, I, R, C, Inherited, Proto> & Static,
readonly traits: Traits, readonly traits: Traits,
) {} ) {}
@@ -41,7 +41,10 @@ export class EffectSchemaTraitExpression<
> & > &
Simplify< Simplify<
Extend<TraitTuple.MapImplStaticMembers<Traits>> Extend<[
Static,
...TraitTuple.MapImplStaticMembers<Traits>
]>
> >
) { ) {
return this.traits.reduce( return this.traits.reduce(
@@ -51,9 +54,9 @@ export class EffectSchemaTraitExpression<
} }
staticImplements(_target: StaticImplements<TraitExpression<Superclass, Traits>>, _context: any) {} staticImplements(_target: StaticImplements<TraitExpression<typeof this.superclass, Traits>>, _context: any) {}
get staticImplementsStage2() { get staticImplementsStage2() {
return (_target: StaticImplements<TraitExpression<Superclass, Traits>>) => {} return (_target: StaticImplements<TraitExpression<typeof this.superclass, Traits>>) => {}
} }
} }

View File

@@ -1,11 +1,12 @@
import { Schema as S } from "@effect/schema" import { Schema as S } from "@effect/schema"
import { Simplify } from "effect/Types" import { Simplify } from "effect/Types"
import { Trait } from "../Trait" import { Trait, TraitTuple } from "../Trait"
import { TraitExpression } from "../TraitExpression" import { TraitExpression } from "../TraitExpression"
import { TraitExpressionBuilder } from "../TraitExpressionBuilder" import { TraitExpressionBuilder } from "../TraitExpressionBuilder"
import { spreadSupertraits } from "../spreadSupertraits" import { spreadSupertraits } from "../spreadSupertraits"
import { traitsUnique } from "../traitsUnique" import { traitsUnique } from "../traitsUnique"
import { StaticMembers } from "../util" import { Extendable, StaticMembers } from "../util"
import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression"
export class EffectSchemaInitialTraitExpressionBuilder { export class EffectSchemaInitialTraitExpressionBuilder {
@@ -124,6 +125,38 @@ export class EffectSchemaTraitExpressionBuilder<
]), ]),
) )
} }
build(): (
Extendable<TraitTuple.MapAbstract<Traits>> extends false
? "Type conflict between the traits abstract definitions."
: Extendable<TraitTuple.MapStaticAbstract<Traits>> extends false
? "Type conflict between the traits static abstract definitions."
: Extendable<[
InstanceType<typeof this.expressionSuperclass>,
...TraitTuple.MapImplInstance<Traits>,
]> extends false
? "Type conflict between the traits implementation instance and/or the superclass instance."
: Extendable<[
Static,
...TraitTuple.MapImplStaticMembers<Traits>,
]> 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
}
} }

View File

@@ -1,30 +1,27 @@
import { Schema as S } from "@effect/schema" import { Schema as S } from "@effect/schema"
import { Implements } from "../TraitExpression" import { Implements } from "../TraitExpression"
import { expression } from "../TraitExpressionBuilder" import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder"
import { extendsEffectSchemaExpression } from "../effect"
const UserSchema = S.Class<unknown>("User")({ const userExp = effectSchemaExpression
id: S.BigIntFromSelf .class("User", {
}) id: S.BigIntFromSelf,
role: S.Union(S.Literal("User"), S.Literal("Admin")),
const userExp = expression })
.extends(UserSchema)
.build() .build()
@userExp.staticImplements @userExp.staticImplements
class User extends extendsEffectSchemaExpression(userExp)<User>() implements Implements<typeof userExp> { class User extends userExp.extends<User>() implements Implements<typeof userExp> {
static aStaticMethodThatShouldBeInherited() {} static aStaticMethodThatShouldBeInherited() {}
} }
const AdminSchema = User.extend<unknown>("Admin")({ const adminExp = effectSchemaExpression
}) .extends(User, "User", {
role: S.Literal("Admin")
const adminExp = expression })
.extends(AdminSchema)
.build() .build()
@adminExp.staticImplements @adminExp.staticImplements
class Admin extends extendsEffectSchemaExpression(adminExp)<Admin>() implements Implements<typeof adminExp> { class Admin extends adminExp.extends<Admin>() implements Implements<typeof adminExp> {
} }