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] } } interface ObservableClassOptions extends Omit {} export const ObservableClass = (options?: ObservableClassOptions) => (self: Self) => class Observable extends self { declare ["constructor"]: typeof Observable constructor(...args: any[]) { super(...args) makeObservable(this, mapValues(this.constructor.fields, () => observable), options, ) } } as Self