import { AsWriteable, Writeable } from "./ObjectTypes" export function shallowClone(obj: T, defaults?: Partial, overrides?: Partial): T { return Object.assign(defaults ?? {}, obj, overrides ?? {}) } export function deepClone(obj: T, defaults?: Partial, overrides?: Partial): T { if (defaults || overrides) { return Object.assign(defaults ?? {}, structuredClone(obj), overrides ?? {}) as T } return structuredClone(obj) } export function writableClone(obj: T, defaults?: Partial, overrides?: Partial): AsWriteable { return deepClone(obj, defaults, overrides) } export function readonlyClone(obj: T, defaults?: Partial, overrides?: Partial): Readonly { return deepClone(obj, defaults, overrides) } export function imutableClone(obj: T, defaults?: Partial, overrides?: Partial): Readonly { return Object.freeze(deepClone(obj, defaults, overrides)) } export const Clone = { deep: deepClone, shallow: shallowClone, writable: writableClone, readonly: readonlyClone, imutable: imutableClone, } export default Clone