import { $mobx, IIsObservableObject, IObservableArray, ObservableMap, ObservableSet, ObservableObjectAdministration, endBatch, isObservableArray, isObservableMap, isObservableSet, isObservableObject, startBatch, die } from "../internal" export function keys(map: ObservableMap): ReadonlyArray export function keys(ar: IObservableArray): ReadonlyArray export function keys(set: ObservableSet): ReadonlyArray export function keys(obj: T): ReadonlyArray export function keys(obj: any): any { if (isObservableObject(obj)) { return (((obj as any) as IIsObservableObject)[ $mobx ] as ObservableObjectAdministration).keys_() } if (isObservableMap(obj) || isObservableSet(obj)) { return Array.from(obj.keys()) } if (isObservableArray(obj)) { return obj.map((_, index) => index) } die(5) } export function values(map: ObservableMap): ReadonlyArray export function values(set: ObservableSet): ReadonlyArray export function values(ar: IObservableArray): ReadonlyArray export function values(obj: T): ReadonlyArray export function values(obj: any): string[] { if (isObservableObject(obj)) { return keys(obj).map(key => obj[key]) } if (isObservableMap(obj)) { return keys(obj).map(key => obj.get(key)) } if (isObservableSet(obj)) { return Array.from(obj.values()) } if (isObservableArray(obj)) { return obj.slice() } die(6) } export function entries(map: ObservableMap): ReadonlyArray<[K, T]> export function entries(set: ObservableSet): ReadonlyArray<[T, T]> export function entries(ar: IObservableArray): ReadonlyArray<[number, T]> export function entries( obj: T ): ReadonlyArray<[string, T extends object ? T[keyof T] : any]> export function entries(obj: any): any { if (isObservableObject(obj)) { return keys(obj).map(key => [key, obj[key]]) } if (isObservableMap(obj)) { return keys(obj).map(key => [key, obj.get(key)]) } if (isObservableSet(obj)) { return Array.from(obj.entries()) } if (isObservableArray(obj)) { return obj.map((key, index) => [index, key]) } die(7) } export function set(obj: ObservableMap, values: { [key: string]: V }) export function set(obj: ObservableMap, key: K, value: V) export function set(obj: ObservableSet, value: T) export function set(obj: IObservableArray, index: number, value: T) export function set(obj: T, values: { [key: string]: any }) export function set(obj: T, key: PropertyKey, value: any) export function set(obj: any, key: any, value?: any): void { if (arguments.length === 2 && !isObservableSet(obj)) { startBatch() const values = key try { for (let key in values) set(obj, key, values[key]) } finally { endBatch() } return } if (isObservableObject(obj)) { ;((obj as any) as IIsObservableObject)[$mobx].set_(key, value) } else if (isObservableMap(obj)) { obj.set(key, value) } else if (isObservableSet(obj)) { obj.add(key) } else if (isObservableArray(obj)) { if (typeof key !== "number") key = parseInt(key, 10) if (key < 0) die(`Invalid index: '${key}'`) startBatch() if (key >= obj.length) obj.length = key + 1 obj[key] = value endBatch() } else die(8) } export function remove(obj: ObservableMap, key: K) export function remove(obj: ObservableSet, key: T) export function remove(obj: IObservableArray, index: number) export function remove(obj: T, key: string) export function remove(obj: any, key: any): void { if (isObservableObject(obj)) { ;((obj as any) as IIsObservableObject)[$mobx].delete_(key) } else if (isObservableMap(obj)) { obj.delete(key) } else if (isObservableSet(obj)) { obj.delete(key) } else if (isObservableArray(obj)) { if (typeof key !== "number") key = parseInt(key, 10) obj.splice(key, 1) } else { die(9) } } export function has(obj: ObservableMap, key: K): boolean export function has(obj: ObservableSet, key: T): boolean export function has(obj: IObservableArray, index: number): boolean export function has(obj: T, key: string): boolean export function has(obj: any, key: any): boolean { if (isObservableObject(obj)) { return ((obj as any) as IIsObservableObject)[$mobx].has_(key) } else if (isObservableMap(obj)) { return obj.has(key) } else if (isObservableSet(obj)) { return obj.has(key) } else if (isObservableArray(obj)) { return key >= 0 && key < obj.length } die(10) } export function get(obj: ObservableMap, key: K): V | undefined export function get(obj: IObservableArray, index: number): T | undefined export function get(obj: T, key: string): any export function get(obj: any, key: any): any { if (!has(obj, key)) return undefined if (isObservableObject(obj)) { return ((obj as any) as IIsObservableObject)[$mobx].get_(key) } else if (isObservableMap(obj)) { return obj.get(key) } else if (isObservableArray(obj)) { return obj[key] } die(11) } export function apiDefineProperty(obj: Object, key: PropertyKey, descriptor: PropertyDescriptor) { if (isObservableObject(obj)) { return ((obj as any) as IIsObservableObject)[$mobx].defineProperty_(key, descriptor) } die(39) } export function apiOwnKeys(obj: Object) { if (isObservableObject(obj)) { return ((obj as any) as IIsObservableObject)[$mobx].ownKeys_() } die(38) }