import { Schema } from "@effect/schema" import { makeObservable, observable, type CreateObservableOptions } from "mobx" import { mapValues } from "remeda" interface ObservableClassSelf { new(...args: any[]): Schema.Struct.Type readonly fields: { readonly [K in keyof Schema.Struct.Fields]: Schema.Struct.Fields[K] } } export const ObservableClass = ( self: Self, options?: Omit, ) => class Observable extends self { declare ["constructor"]: typeof Observable constructor(...args: any[]) { super(...args) makeObservable(this, mapValues(this.constructor.fields, () => observable), options, ) } } as Self