import { IteratorStepOptions, entries, keys, map, reduce, reduceObj, values } from "./Iterate" import Clone from "./Clone" import Keys from "./Keys" import Assign from "./Assign" import { ObjectLike } from "./ObjectTypes" /** * `Obj` is a utility class for working with objects */ export function Obj>(obj: T) { return { // iterate entries: (stepOptions?: IteratorStepOptions) => entries(obj, stepOptions), keys: (stepOptions?: IteratorStepOptions) => keys(obj, stepOptions), values: (stepOptions?: IteratorStepOptions) => values(obj, stepOptions), reduce: (init: R, reducer: (acc: R, key: keyof T, value: T[keyof T]) => R) => reduce(obj, init, reducer), reduceObj: (reducer: (acc: R, key: keyof T, value: T[keyof T]) => R) => reduceObj(obj, reducer), map: (mapper: (k: keyof T, value: T[keyof T]) => R) => map(obj, mapper), // mutate assignProp: >(overrides: D) => Object.assign(obj, overrides), // keys hasKey: (k: string) => Keys.isKeyOf(k, obj), keyOf: (k: string) => Keys.keyOf(k, obj), key: (k: string) => Keys.asKeyOf(k, obj), // props freeze: () => Object.freeze(obj), // clone clone: , O extends Partial>(defaults?: D, override?: O) => Clone.deep(obj, defaults, override), shallowClone: , O extends Partial>(defaults?: D, override?: O) => Clone.shallow(obj, defaults, override), writableClone: , O extends Partial>(defaults?: D, override?: O) => Clone.writable(obj, defaults, override), readonlyClone: , O extends Partial>(defaults?: D, override?: O) => Clone.readonly(obj, defaults, override), imutableClone: , O extends Partial>(defaults?: D, override?: O) => Clone.imutable(obj, defaults, override), defaults: >(defaults: D) => Assign.defaults(obj, defaults), override: >(overrides: D) => Assign.override(obj, overrides), } } export default Obj