diff --git a/bun.lockb b/bun.lockb index da6985e..ab3040c 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 9c6b940..d0dc5f7 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ }, "optionalDependencies": { "@effect/schema": "^0.67.22", - "effect": "^3.3.1" + "effect": "^3.3.1", + "mobx": "^6.12.3" } } diff --git a/src/effect/schema/MobXObservable.ts b/src/effect/schema/MobXObservable.ts new file mode 100644 index 0000000..ea4cbdb --- /dev/null +++ b/src/effect/schema/MobXObservable.ts @@ -0,0 +1,24 @@ +import type { Class, Struct } from "@effect/schema/Schema" +import { makeObservable, observable, type CreateObservableOptions } from "mobx" +import { mapValues } from "remeda" + + +export function MobXObservable< + C extends Class +>( + class_: C, + options?: Omit, +) { + return class MobXObservable extends (class_ as Class) { + declare ["constructor"]: typeof MobXObservable + + constructor(...args: any[]) { + super(...args) + + makeObservable(this, + mapValues(this.constructor.fields, () => observable), + options, + ) + } + } as C +} diff --git a/src/effect/schema/index.ts b/src/effect/schema/index.ts index d6234ea..391c95d 100644 --- a/src/effect/schema/index.ts +++ b/src/effect/schema/index.ts @@ -1,2 +1,3 @@ +export { MobXObservable } from "./MobXObservable" export { MutableClass } from "./MutableClass" export type { TMutableClass } from "./MutableClass"