import * as P from "effect/Predicate"; export type DeepPartial = T extends readonly (infer U)[] ? readonly DeepPartial[] : T extends object ? { [K in keyof T]?: DeepPartial } : T; export function deepMerge>(current: T, patch: DeepPartial): T { if (!P.isObject(current) || !P.isObject(patch)) { return patch as T; } const next = { ...current } as Record; for (const [key, value] of Object.entries(patch)) { if (value === undefined) continue; const existing = next[key]; next[key] = P.isObject(existing) && P.isObject(value) ? deepMerge(existing, value) : value; } return next as T; }