UNPKG

6.04 kBPlain TextView Raw
1import {
2 $mobx,
3 IIsObservableObject,
4 IObservableArray,
5 ObservableMap,
6 ObservableSet,
7 ObservableObjectAdministration,
8 endBatch,
9 isObservableArray,
10 isObservableMap,
11 isObservableSet,
12 isObservableObject,
13 startBatch,
14 die
15} from "../internal"
16
17export function keys<K>(map: ObservableMap<K, any>): ReadonlyArray<K>
18export function keys<T>(ar: IObservableArray<T>): ReadonlyArray<number>
19export function keys<T>(set: ObservableSet<T>): ReadonlyArray<T>
20export function keys<T extends Object>(obj: T): ReadonlyArray<PropertyKey>
21export function keys(obj: any): any {
22 if (isObservableObject(obj)) {
23 return (((obj as any) as IIsObservableObject)[
24 $mobx
25 ] as ObservableObjectAdministration).keys_()
26 }
27 if (isObservableMap(obj) || isObservableSet(obj)) {
28 return Array.from(obj.keys())
29 }
30 if (isObservableArray(obj)) {
31 return obj.map((_, index) => index)
32 }
33 die(5)
34}
35
36export function values<K, T>(map: ObservableMap<K, T>): ReadonlyArray<T>
37export function values<T>(set: ObservableSet<T>): ReadonlyArray<T>
38export function values<T>(ar: IObservableArray<T>): ReadonlyArray<T>
39export function values<T = any>(obj: T): ReadonlyArray<T extends object ? T[keyof T] : any>
40export function values(obj: any): string[] {
41 if (isObservableObject(obj)) {
42 return keys(obj).map(key => obj[key])
43 }
44 if (isObservableMap(obj)) {
45 return keys(obj).map(key => obj.get(key))
46 }
47 if (isObservableSet(obj)) {
48 return Array.from(obj.values())
49 }
50 if (isObservableArray(obj)) {
51 return obj.slice()
52 }
53 die(6)
54}
55
56export function entries<K, T>(map: ObservableMap<K, T>): ReadonlyArray<[K, T]>
57export function entries<T>(set: ObservableSet<T>): ReadonlyArray<[T, T]>
58export function entries<T>(ar: IObservableArray<T>): ReadonlyArray<[number, T]>
59export function entries<T = any>(
60 obj: T
61): ReadonlyArray<[string, T extends object ? T[keyof T] : any]>
62export function entries(obj: any): any {
63 if (isObservableObject(obj)) {
64 return keys(obj).map(key => [key, obj[key]])
65 }
66 if (isObservableMap(obj)) {
67 return keys(obj).map(key => [key, obj.get(key)])
68 }
69 if (isObservableSet(obj)) {
70 return Array.from(obj.entries())
71 }
72 if (isObservableArray(obj)) {
73 return obj.map((key, index) => [index, key])
74 }
75 die(7)
76}
77
78export function set<V>(obj: ObservableMap<PropertyKey, V>, values: { [key: string]: V })
79export function set<K, V>(obj: ObservableMap<K, V>, key: K, value: V)
80export function set<T>(obj: ObservableSet<T>, value: T)
81export function set<T>(obj: IObservableArray<T>, index: number, value: T)
82export function set<T extends Object>(obj: T, values: { [key: string]: any })
83export function set<T extends Object>(obj: T, key: PropertyKey, value: any)
84export function set(obj: any, key: any, value?: any): void {
85 if (arguments.length === 2 && !isObservableSet(obj)) {
86 startBatch()
87 const values = key
88 try {
89 for (let key in values) set(obj, key, values[key])
90 } finally {
91 endBatch()
92 }
93 return
94 }
95 if (isObservableObject(obj)) {
96 ;((obj as any) as IIsObservableObject)[$mobx].set_(key, value)
97 } else if (isObservableMap(obj)) {
98 obj.set(key, value)
99 } else if (isObservableSet(obj)) {
100 obj.add(key)
101 } else if (isObservableArray(obj)) {
102 if (typeof key !== "number") key = parseInt(key, 10)
103 if (key < 0) die(`Invalid index: '${key}'`)
104 startBatch()
105 if (key >= obj.length) obj.length = key + 1
106 obj[key] = value
107 endBatch()
108 } else die(8)
109}
110
111export function remove<K, V>(obj: ObservableMap<K, V>, key: K)
112export function remove<T>(obj: ObservableSet<T>, key: T)
113export function remove<T>(obj: IObservableArray<T>, index: number)
114export function remove<T extends Object>(obj: T, key: string)
115export function remove(obj: any, key: any): void {
116 if (isObservableObject(obj)) {
117 ;((obj as any) as IIsObservableObject)[$mobx].delete_(key)
118 } else if (isObservableMap(obj)) {
119 obj.delete(key)
120 } else if (isObservableSet(obj)) {
121 obj.delete(key)
122 } else if (isObservableArray(obj)) {
123 if (typeof key !== "number") key = parseInt(key, 10)
124 obj.splice(key, 1)
125 } else {
126 die(9)
127 }
128}
129
130export function has<K>(obj: ObservableMap<K, any>, key: K): boolean
131export function has<T>(obj: ObservableSet<T>, key: T): boolean
132export function has<T>(obj: IObservableArray<T>, index: number): boolean
133export function has<T extends Object>(obj: T, key: string): boolean
134export function has(obj: any, key: any): boolean {
135 if (isObservableObject(obj)) {
136 return ((obj as any) as IIsObservableObject)[$mobx].has_(key)
137 } else if (isObservableMap(obj)) {
138 return obj.has(key)
139 } else if (isObservableSet(obj)) {
140 return obj.has(key)
141 } else if (isObservableArray(obj)) {
142 return key >= 0 && key < obj.length
143 }
144 die(10)
145}
146
147export function get<K, V>(obj: ObservableMap<K, V>, key: K): V | undefined
148export function get<T>(obj: IObservableArray<T>, index: number): T | undefined
149export function get<T extends Object>(obj: T, key: string): any
150export function get(obj: any, key: any): any {
151 if (!has(obj, key)) return undefined
152 if (isObservableObject(obj)) {
153 return ((obj as any) as IIsObservableObject)[$mobx].get_(key)
154 } else if (isObservableMap(obj)) {
155 return obj.get(key)
156 } else if (isObservableArray(obj)) {
157 return obj[key]
158 }
159 die(11)
160}
161
162export function apiDefineProperty(obj: Object, key: PropertyKey, descriptor: PropertyDescriptor) {
163 if (isObservableObject(obj)) {
164 return ((obj as any) as IIsObservableObject)[$mobx].defineProperty_(key, descriptor)
165 }
166 die(39)
167}
168
169export function apiOwnKeys(obj: Object) {
170 if (isObservableObject(obj)) {
171 return ((obj as any) as IIsObservableObject)[$mobx].ownKeys_()
172 }
173 die(38)
174}