mobx
Version:
Simple, scalable state management.
189 lines (179 loc) • 6.19 kB
text/typescript
import {
$mobx,
IIsObservableObject,
IObservableArray,
ObservableMap,
ObservableSet,
ObservableObjectAdministration,
endBatch,
isObservableArray,
isObservableMap,
isObservableSet,
isObservableObject,
startBatch,
die
} from "../internal"
export function keys<K>(map: ObservableMap<K, any>): ReadonlyArray<K>
export function keys<T>(ar: IObservableArray<T>): ReadonlyArray<number>
export function keys<T>(set: ObservableSet<T>): ReadonlyArray<T>
export function keys<T extends Object>(obj: T): ReadonlyArray<PropertyKey>
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<K, T>(map: ObservableMap<K, T>): ReadonlyArray<T>
export function values<T>(set: ObservableSet<T>): ReadonlyArray<T>
export function values<T>(ar: IObservableArray<T>): ReadonlyArray<T>
export function values<T = any>(obj: T): ReadonlyArray<T extends object ? T[keyof T] : any>
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<K, T>(map: ObservableMap<K, T>): ReadonlyArray<[K, T]>
export function entries<T>(set: ObservableSet<T>): ReadonlyArray<[T, T]>
export function entries<T>(ar: IObservableArray<T>): ReadonlyArray<[number, T]>
export function entries<T = any>(
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<V>(obj: ObservableMap<PropertyKey, V>, values: { [key: string]: V })
export function set<K, V>(obj: ObservableMap<K, V>, key: K, value: V)
export function set<T>(obj: ObservableSet<T>, value: T)
export function set<T>(obj: IObservableArray<T>, index: number, value: T)
export function set<T extends Object>(obj: T, values: { [key: string]: any })
export function set<T extends Object>(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<K, V>(obj: ObservableMap<K, V>, key: K)
export function remove<T>(obj: ObservableSet<T>, key: T)
export function remove<T>(obj: IObservableArray<T>, index: number)
export function remove<T extends Object>(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<K>(obj: ObservableMap<K, any>, key: K): boolean
export function has<T>(obj: ObservableSet<T>, key: T): boolean
export function has<T>(obj: IObservableArray<T>, index: number): boolean
export function has<T extends Object>(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<K, V>(obj: ObservableMap<K, V>, key: K): V | undefined
export function get<T>(obj: IObservableArray<T>, index: number): T | undefined
export function get<T extends Object>(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)
}