1 | import {
|
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 |
|
17 | export function keys<K>(map: ObservableMap<K, any>): ReadonlyArray<K>
|
18 | export function keys<T>(ar: IObservableArray<T>): ReadonlyArray<number>
|
19 | export function keys<T>(set: ObservableSet<T>): ReadonlyArray<T>
|
20 | export function keys<T extends Object>(obj: T): ReadonlyArray<PropertyKey>
|
21 | export 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 |
|
36 | export function values<K, T>(map: ObservableMap<K, T>): ReadonlyArray<T>
|
37 | export function values<T>(set: ObservableSet<T>): ReadonlyArray<T>
|
38 | export function values<T>(ar: IObservableArray<T>): ReadonlyArray<T>
|
39 | export function values<T = any>(obj: T): ReadonlyArray<T extends object ? T[keyof T] : any>
|
40 | export 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 |
|
56 | export function entries<K, T>(map: ObservableMap<K, T>): ReadonlyArray<[K, T]>
|
57 | export function entries<T>(set: ObservableSet<T>): ReadonlyArray<[T, T]>
|
58 | export function entries<T>(ar: IObservableArray<T>): ReadonlyArray<[number, T]>
|
59 | export function entries<T = any>(
|
60 | obj: T
|
61 | ): ReadonlyArray<[string, T extends object ? T[keyof T] : any]>
|
62 | export 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 |
|
78 | export function set<V>(obj: ObservableMap<PropertyKey, V>, values: { [key: string]: V })
|
79 | export function set<K, V>(obj: ObservableMap<K, V>, key: K, value: V)
|
80 | export function set<T>(obj: ObservableSet<T>, value: T)
|
81 | export function set<T>(obj: IObservableArray<T>, index: number, value: T)
|
82 | export function set<T extends Object>(obj: T, values: { [key: string]: any })
|
83 | export function set<T extends Object>(obj: T, key: PropertyKey, value: any)
|
84 | export 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 |
|
111 | export function remove<K, V>(obj: ObservableMap<K, V>, key: K)
|
112 | export function remove<T>(obj: ObservableSet<T>, key: T)
|
113 | export function remove<T>(obj: IObservableArray<T>, index: number)
|
114 | export function remove<T extends Object>(obj: T, key: string)
|
115 | export 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 |
|
130 | export function has<K>(obj: ObservableMap<K, any>, key: K): boolean
|
131 | export function has<T>(obj: ObservableSet<T>, key: T): boolean
|
132 | export function has<T>(obj: IObservableArray<T>, index: number): boolean
|
133 | export function has<T extends Object>(obj: T, key: string): boolean
|
134 | export 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 |
|
147 | export function get<K, V>(obj: ObservableMap<K, V>, key: K): V | undefined
|
148 | export function get<T>(obj: IObservableArray<T>, index: number): T | undefined
|
149 | export function get<T extends Object>(obj: T, key: string): any
|
150 | export 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 |
|
162 | export 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 |
|
169 | export function apiOwnKeys(obj: Object) {
|
170 | if (isObservableObject(obj)) {
|
171 | return ((obj as any) as IIsObservableObject)[$mobx].ownKeys_()
|
172 | }
|
173 | die(38)
|
174 | }
|