import { Schema as S } from "@effect/schema" import { reaction, runInAction } from "mobx" import { Jsonifiable } from "./Jsonifiable" import { MobXObservable, MutableTaggedClass } from "./class" class User extends MutableTaggedClass()("User", { id: S.BigIntFromSelf, role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), }).pipe( MobXObservable ) {} const JsonifiableUser = User.pipe( Jsonifiable(S.Struct({ ...User.fields, id: S.BigInt, })) ) const user1 = new User({ id: -1n, role: "BasicUser" }) reaction(() => user1.id, id => console.log(`user1 id changed: ${ id }`)) class Admin extends User.extend("Admin")({ // role: S.Literal("Admin") }) {} const user2 = new Admin({ id: -1n, role: "Admin" }) reaction(() => user2.id, id => console.log(`user2 id changed: ${ id }`)) runInAction(() => { user1.id = 1n }) runInAction(() => { user2.id = 2n })