import { Schema as S } from "@effect/schema" import { makeObservable, observable, type CreateObservableOptions } from "mobx" import { mapValues } from "remeda" interface MobXObservableInput { new(...args: any[]): S.Struct.Type readonly fields: { readonly [K in keyof S.Struct.Fields]: S.Struct.Fields[K] } } export function MobXObservable< This extends MobXObservableInput >( class_: This, options?: Omit, ) { return class MobXObservable extends class_ { declare ["constructor"]: typeof MobXObservable constructor(...args: any[]) { super(...args) makeObservable(this, mapValues(this.constructor.fields, () => observable), options, ) } } as This }