From 2a9217e2a1b48cc6aba4f4a0d477566dd826a7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 13 Jun 2024 00:47:56 +0200 Subject: [PATCH] TaggedClass work --- src/effect/schema/class/MutableTaggedClass.ts | 21 +++++++++++++++++++ src/effect/schema/class/TaggedClass.ts | 20 ++++++++++++++++++ src/effect/schema/class/index.ts | 1 + src/effect/schema/class/tests.ts | 11 +++++++--- 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/effect/schema/class/MutableTaggedClass.ts create mode 100644 src/effect/schema/class/TaggedClass.ts diff --git a/src/effect/schema/class/MutableTaggedClass.ts b/src/effect/schema/class/MutableTaggedClass.ts new file mode 100644 index 0000000..b4c3e0e --- /dev/null +++ b/src/effect/schema/class/MutableTaggedClass.ts @@ -0,0 +1,21 @@ +import { Schema as S } from "@effect/schema" +import type { Annotations, Struct } from "@effect/schema/Schema" +import type { TMutableClass } from "./TMutableClass" +import type { HasFields } from "./util" + + +export function MutableClass(identifier: string) { + return ( + fieldsOr: Fields | HasFields, + annotations?: Annotations.Schema, + ) => + S.Class(identifier)(fieldsOr, annotations) as TMutableClass< + Self, + Fields, + Struct.Encoded, + Struct.Context, + Struct.Constructor, + {}, + {} + > +} diff --git a/src/effect/schema/class/TaggedClass.ts b/src/effect/schema/class/TaggedClass.ts new file mode 100644 index 0000000..1619805 --- /dev/null +++ b/src/effect/schema/class/TaggedClass.ts @@ -0,0 +1,20 @@ +import { Schema as S } from "@effect/schema" +import type { Annotations, PropertySignature, Struct } from "@effect/schema/Schema" +import type { HasFields } from "./util" + + +export function TaggedClass(identifier?: string) { + return < + Tag extends string, + Fields extends Struct.Fields, + >( + tag: Tag, + fieldsOr: Fields | HasFields, + annotations?: Annotations.Schema, + ) => + S.TaggedClass(identifier)(tag, fieldsOr, annotations) as S.TaggedClass< + Self, + Tag, + { readonly _tag: PropertySignature<":", Tag, never, ":", Tag, true, never> } & Fields + > +} diff --git a/src/effect/schema/class/index.ts b/src/effect/schema/class/index.ts index 2cb45fd..fa8edb0 100644 --- a/src/effect/schema/class/index.ts +++ b/src/effect/schema/class/index.ts @@ -3,3 +3,4 @@ export { MobXObservable } from "./MobXObservable" export { Mutable } from "./Mutable" export { MutableClass } from "./MutableClass" export type { TMutableClass } from "./TMutableClass" +export { TaggedClass } from "./TaggedClass" diff --git a/src/effect/schema/class/tests.ts b/src/effect/schema/class/tests.ts index 1a7ed47..ddad564 100644 --- a/src/effect/schema/class/tests.ts +++ b/src/effect/schema/class/tests.ts @@ -4,15 +4,20 @@ import { pipe } from "remeda" import { Mutable } from "./Mutable" import { MobXObservable } from "./MobXObservable" import { Class } from "./Class" +import { TaggedClass } from "./TaggedClass" const UserSuper = () => pipe( - Class("User")({ + // Class("User")({ + // id: S.BigIntFromSelf, + // role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), + // }), + TaggedClass()("User", { id: S.BigIntFromSelf, role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), }), - Mutable, + // Mutable, MobXObservable, ) @@ -24,7 +29,7 @@ user1.id = 1n class Admin extends User.extend("Admin")({ - role: S.Literal("Admin") + // role: S.Literal("Admin") }) {} const user2 = new Admin({ id: 2n, role: "Admin" })