hyperscript-rxjs 1.3.14 → 1.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/package.json +13 -22
  2. package/src/array/advance.d.ts +9 -0
  3. package/src/array/advance.js +13 -0
  4. package/src/array/advance.test.js +12 -0
  5. package/src/array/arrayInsert.d.ts +8 -0
  6. package/src/array/arrayInsert.js +13 -0
  7. package/src/array/arrayInsert.test.js +13 -0
  8. package/src/array/arrayRemove.d.ts +7 -0
  9. package/src/array/arrayRemove.js +15 -0
  10. package/src/array/arrayRemove.test.js +13 -0
  11. package/src/array/findLastIndex.d.ts +14 -0
  12. package/src/array/findLastIndex.js +20 -0
  13. package/src/array/findLastIndex.test.js +41 -0
  14. package/src/array/index.d.ts +9 -0
  15. package/src/array/index.js +9 -0
  16. package/src/array/isRange.d.ts +7 -0
  17. package/src/array/isRange.js +15 -0
  18. package/src/array/isRange.test.js +6 -0
  19. package/src/array/rangeArray.d.ts +7 -0
  20. package/src/array/rangeArray.js +10 -0
  21. package/src/array/rangeArray.test.js +11 -0
  22. package/src/array/unwrapArgs.d.ts +10 -0
  23. package/src/array/unwrapArgs.js +15 -0
  24. package/src/array/unwrapArgs.test.js +33 -0
  25. package/src/array/zipArray.d.ts +11 -0
  26. package/src/array/zipArray.js +24 -0
  27. package/src/array/zipArray.test.js +16 -0
  28. package/src/comparers/Comparer.d.ts +101 -0
  29. package/src/comparers/Comparer.js +149 -0
  30. package/src/comparers/comparers.d.ts +21 -0
  31. package/src/comparers/comparers.js +10 -0
  32. package/src/comparers/differenceSet.d.ts +20 -0
  33. package/src/comparers/differenceSet.js +35 -0
  34. package/src/comparers/differenceSet.test.js +11 -0
  35. package/src/comparers/distinctArray.d.ts +13 -0
  36. package/src/comparers/distinctArray.js +30 -0
  37. package/src/comparers/distinctArray.test.js +10 -0
  38. package/src/comparers/findIndexInSet.d.ts +20 -0
  39. package/src/comparers/findIndexInSet.js +27 -0
  40. package/src/comparers/findIndexInSet.test.js +8 -0
  41. package/src/comparers/groupArrayBy.d.ts +19 -0
  42. package/src/comparers/groupArrayBy.js +29 -0
  43. package/src/comparers/groupArrayBy.test.js +38 -0
  44. package/src/comparers/groupSortedEntries.d.ts +17 -0
  45. package/src/comparers/groupSortedEntries.js +38 -0
  46. package/src/comparers/groupSortedEntries.test.js +46 -0
  47. package/src/comparers/index.d.ts +14 -0
  48. package/src/comparers/index.js +14 -0
  49. package/src/comparers/intersectSet.d.ts +19 -0
  50. package/src/comparers/intersectSet.js +35 -0
  51. package/src/comparers/intersectSet.test.js +14 -0
  52. package/src/comparers/isEqualset.d.ts +22 -0
  53. package/src/comparers/isEqualset.js +33 -0
  54. package/src/comparers/isEqualset.test.js +22 -0
  55. package/src/comparers/isSubset.d.ts +21 -0
  56. package/src/comparers/isSubset.js +33 -0
  57. package/src/comparers/isSubset.test.js +21 -0
  58. package/src/comparers/isSuperset.d.ts +21 -0
  59. package/src/comparers/isSuperset.js +13 -0
  60. package/src/comparers/isSuperset.test.js +21 -0
  61. package/src/comparers/sortedArrayToSet.d.ts +20 -0
  62. package/src/comparers/sortedArrayToSet.js +35 -0
  63. package/src/comparers/sortedArrayToSet.test.js +11 -0
  64. package/src/comparers/unionSet.d.ts +21 -0
  65. package/src/comparers/unionSet.js +34 -0
  66. package/src/comparers/unionSet.test.js +11 -0
  67. package/src/comparison/compareDate.d.ts +8 -0
  68. package/src/comparison/compareDate.js +11 -0
  69. package/src/comparison/compareEntries.d.ts +13 -0
  70. package/src/comparison/compareEntries.js +13 -0
  71. package/src/comparison/compareKey.d.ts +11 -0
  72. package/src/comparison/compareKey.js +25 -0
  73. package/src/comparison/compareKey.test.js +21 -0
  74. package/src/comparison/compareKeyPath.d.ts +15 -0
  75. package/src/comparison/compareKeyPath.js +33 -0
  76. package/src/comparison/compareKeyPath.test.js +28 -0
  77. package/src/comparison/compareNumber.d.ts +11 -0
  78. package/src/comparison/compareNumber.js +27 -0
  79. package/src/comparison/compareNumber.test.js +21 -0
  80. package/src/comparison/defaultCompare.d.ts +8 -0
  81. package/src/comparison/defaultCompare.js +12 -0
  82. package/src/comparison/defaultCompare.test.js +24 -0
  83. package/src/comparison/index.d.ts +7 -0
  84. package/src/comparison/index.js +7 -0
  85. package/src/comparison/infinity.test.js +122 -0
  86. package/src/comparison/typeof.test.js +64 -0
  87. package/src/comparison/types.d.ts +5 -0
  88. package/src/comparison/types.js +11 -0
  89. package/src/deep/Deep.d.ts +58 -0
  90. package/src/deep/Deep.js +267 -0
  91. package/src/deep/Deep.test.js +130 -0
  92. package/src/deep/deepCombineLatest.test.js +36 -0
  93. package/src/deep/deepMerge.test.js +34 -0
  94. package/src/deep/differenceDeep.test.js +31 -0
  95. package/src/deep/freshValueDeep.test.js +17 -0
  96. package/src/deep/index.d.ts +1 -0
  97. package/src/deep/index.js +2 -0
  98. package/src/deep/intersectDeep.test.js +25 -0
  99. package/src/deep/intersectEntries.d.ts +13 -0
  100. package/src/deep/intersectEntries.js +37 -0
  101. package/src/deep/intersectEntries.test.js +20 -0
  102. package/src/deep/objectToDeep.test.js +31 -0
  103. package/src/deep/replaceValueDeep.test.js +21 -0
  104. package/src/deep/unionDeep.test.js +30 -0
  105. package/src/deep/zipValueDeep.test.js +21 -0
  106. package/src/deep-rxjs/ObservableArray.d.ts +55 -0
  107. package/src/deep-rxjs/ObservableArray.js +94 -0
  108. package/src/deep-rxjs/ObservableArray.test.js +117 -0
  109. package/src/deep-rxjs/index.d.ts +2 -0
  110. package/src/deep-rxjs/index.js +2 -0
  111. package/src/deep-rxjs/isRxType.d.ts +9 -0
  112. package/src/deep-rxjs/isRxType.js +15 -0
  113. package/src/deep-rxjs/isRxType.test.js +43 -0
  114. package/src/hyperscript-rxjs/HyperscriptExtensions.d.ts +20 -0
  115. package/src/hyperscript-rxjs/checkbox.d.ts +13 -0
  116. package/src/hyperscript-rxjs/checkbox.js +47 -0
  117. package/src/hyperscript-rxjs/checkbox.test.js +68 -0
  118. package/src/hyperscript-rxjs/choice.d.ts +13 -0
  119. package/src/hyperscript-rxjs/choice.js +24 -0
  120. package/src/hyperscript-rxjs/choice.test.js +108 -0
  121. package/src/hyperscript-rxjs/collapse.d.ts +14 -0
  122. package/src/hyperscript-rxjs/collapse.js +32 -0
  123. package/src/hyperscript-rxjs/collapse.test.js +67 -0
  124. package/src/hyperscript-rxjs/displays/blockLevelFamily.d.ts +5 -0
  125. package/src/hyperscript-rxjs/displays/blockLevelFamily.js +51 -0
  126. package/src/hyperscript-rxjs/displays/getDisplay.d.ts +7 -0
  127. package/src/hyperscript-rxjs/displays/getDisplay.js +51 -0
  128. package/src/hyperscript-rxjs/displays/getDisplay.test.js +56 -0
  129. package/src/hyperscript-rxjs/displays/index.d.ts +3 -0
  130. package/src/hyperscript-rxjs/displays/index.js +3 -0
  131. package/src/hyperscript-rxjs/displays/inlineFamily.d.ts +5 -0
  132. package/src/hyperscript-rxjs/displays/inlineFamily.js +73 -0
  133. package/src/hyperscript-rxjs/flip.d.ts +15 -0
  134. package/src/hyperscript-rxjs/flip.js +29 -0
  135. package/src/hyperscript-rxjs/flip.test.js +85 -0
  136. package/src/hyperscript-rxjs/fragment.d.ts +10 -0
  137. package/src/hyperscript-rxjs/fragment.js +22 -0
  138. package/src/hyperscript-rxjs/fragment.test.js +70 -0
  139. package/src/hyperscript-rxjs/hyperscript.d.ts +15 -0
  140. package/src/hyperscript-rxjs/hyperscript.js +170 -0
  141. package/src/hyperscript-rxjs/hyperscript.test.js +75 -0
  142. package/src/hyperscript-rxjs/index.d.ts +19 -0
  143. package/src/hyperscript-rxjs/index.js +19 -0
  144. package/src/hyperscript-rxjs/multiselect.d.ts +18 -0
  145. package/src/hyperscript-rxjs/multiselect.js +41 -0
  146. package/src/hyperscript-rxjs/multiselect.test.js +121 -0
  147. package/src/hyperscript-rxjs/numberbox.d.ts +14 -0
  148. package/src/hyperscript-rxjs/numberbox.js +73 -0
  149. package/src/hyperscript-rxjs/numberbox.test.js +84 -0
  150. package/src/hyperscript-rxjs/radio.d.ts +15 -0
  151. package/src/hyperscript-rxjs/radio.js +53 -0
  152. package/src/hyperscript-rxjs/radio.test.js +59 -0
  153. package/src/hyperscript-rxjs/select.d.ts +28 -0
  154. package/src/hyperscript-rxjs/select.js +88 -0
  155. package/src/hyperscript-rxjs/select.test.js +101 -0
  156. package/src/hyperscript-rxjs/tabControls/bindTabIndex.d.ts +12 -0
  157. package/src/hyperscript-rxjs/tabControls/bindTabIndex.js +59 -0
  158. package/src/hyperscript-rxjs/tabControls/index.d.ts +8 -0
  159. package/src/hyperscript-rxjs/tabControls/index.js +10 -0
  160. package/src/hyperscript-rxjs/tabControls/tabControl.d.ts +19 -0
  161. package/src/hyperscript-rxjs/tabControls/tabControl.js +40 -0
  162. package/src/hyperscript-rxjs/tabControls/tabControl.test.js +98 -0
  163. package/src/hyperscript-rxjs/tabControls/tabNavItem.d.ts +9 -0
  164. package/src/hyperscript-rxjs/tabControls/tabNavItem.js +30 -0
  165. package/src/hyperscript-rxjs/tabControls/tabPanel.d.ts +9 -0
  166. package/src/hyperscript-rxjs/tabControls/tabPanel.js +21 -0
  167. package/src/hyperscript-rxjs/tabControls/tabRoot.d.ts +7 -0
  168. package/src/hyperscript-rxjs/tabControls/tabRoot.js +26 -0
  169. package/src/hyperscript-rxjs/tags.d.ts +193 -0
  170. package/src/hyperscript-rxjs/tags.js +751 -0
  171. package/src/hyperscript-rxjs/tags.test.js +75 -0
  172. package/src/hyperscript-rxjs/textNode.d.ts +11 -0
  173. package/src/hyperscript-rxjs/textNode.js +51 -0
  174. package/src/hyperscript-rxjs/textNode.test.js +56 -0
  175. package/src/hyperscript-rxjs/textarea.d.ts +17 -0
  176. package/src/hyperscript-rxjs/textarea.js +45 -0
  177. package/src/hyperscript-rxjs/textarea.test.js +52 -0
  178. package/src/hyperscript-rxjs/textbox.d.ts +15 -0
  179. package/src/hyperscript-rxjs/textbox.js +42 -0
  180. package/src/hyperscript-rxjs/textbox.test.js +52 -0
  181. package/src/index.d.ts +19 -0
  182. package/src/index.js +19 -0
  183. package/src/nodes/attachSubscriptionToNode.d.ts +13 -0
  184. package/src/nodes/attachSubscriptionToNode.js +25 -0
  185. package/src/nodes/attachSubscriptionToNode.test.js +73 -0
  186. package/src/nodes/index.d.ts +6 -0
  187. package/src/nodes/index.js +6 -0
  188. package/src/nodes/normalizeChildNodes.d.ts +9 -0
  189. package/src/nodes/normalizeChildNodes.js +15 -0
  190. package/src/nodes/normalizeChildNodes.test.js +55 -0
  191. package/src/nodes/parseHyperscriptArgs.d.ts +10 -0
  192. package/src/nodes/parseHyperscriptArgs.js +57 -0
  193. package/src/nodes/parseHyperscriptArgs.test.js +85 -0
  194. package/src/nodes/pipeEvent.d.ts +15 -0
  195. package/src/nodes/pipeEvent.js +49 -0
  196. package/src/nodes/pipeEvent.test.js +97 -0
  197. package/src/nodes/subscribeEvent.d.ts +15 -0
  198. package/src/nodes/subscribeEvent.js +56 -0
  199. package/src/nodes/subscribeEvent.test.js +88 -0
  200. package/src/object/index.d.ts +10 -0
  201. package/src/object/index.js +11 -0
  202. package/src/object/intersectObject.d.ts +12 -0
  203. package/src/object/intersectObject.js +23 -0
  204. package/src/object/intersectObject.test.js +69 -0
  205. package/src/object/isEmptyObject.d.ts +7 -0
  206. package/src/object/isEmptyObject.js +13 -0
  207. package/src/object/isEmptyObject.test.js +33 -0
  208. package/src/object/isPlainObject.d.ts +11 -0
  209. package/src/object/isPlainObject.js +18 -0
  210. package/src/object/nestedCombineLatest.d.ts +11 -0
  211. package/src/object/nestedCombineLatest.js +18 -0
  212. package/src/object/nestedCombineLatest.test.js +25 -0
  213. package/src/object/nestedMerge.d.ts +11 -0
  214. package/src/object/nestedMerge.js +11 -0
  215. package/src/object/nestedMerge.test.js +61 -0
  216. package/src/object/pickBehaviorSubject.d.ts +13 -0
  217. package/src/object/pickBehaviorSubject.js +81 -0
  218. package/src/object/pickBehaviorSubject.test.js +88 -0
  219. package/src/object/pluckProperty.d.ts +13 -0
  220. package/src/object/pluckProperty.js +24 -0
  221. package/src/object/pluckProperty.test.js +37 -0
  222. package/src/object/restore.d.ts +12 -0
  223. package/src/object/restore.js +69 -0
  224. package/src/object/restore.test.js +124 -0
  225. package/src/object/splitObjectByObservable.d.ts +12 -0
  226. package/src/object/splitObjectByObservable.js +41 -0
  227. package/src/object/splitObjectByObservable.test.js +78 -0
  228. package/src/props/getNestedProperty.d.ts +12 -0
  229. package/src/props/getNestedProperty.js +31 -0
  230. package/src/props/getNestedProperty.test.js +72 -0
  231. package/src/props/index.d.ts +7 -0
  232. package/src/props/index.js +7 -0
  233. package/src/props/parsePropName.d.ts +13 -0
  234. package/src/props/parsePropName.js +45 -0
  235. package/src/props/parsePropName.test.js +67 -0
  236. package/src/props/setProp.d.ts +16 -0
  237. package/src/props/setProp.js +42 -0
  238. package/src/props/setProp.test.js +59 -0
  239. package/src/props/setProps.d.ts +14 -0
  240. package/src/props/setProps.js +47 -0
  241. package/src/props/setProps.test.js +97 -0
  242. package/src/props/subscribeProp.d.ts +16 -0
  243. package/src/props/subscribeProp.js +47 -0
  244. package/src/props/subscribeProp.test.js +81 -0
  245. package/src/ramda/compose.d.ts +10 -0
  246. package/src/ramda/compose.js +36 -0
  247. package/src/ramda/compose.test.js +73 -0
  248. package/src/ramda/cond.d.ts +12 -0
  249. package/src/ramda/cond.js +29 -0
  250. package/src/ramda/cond.test.js +88 -0
  251. package/src/ramda/fold.d.ts +13 -0
  252. package/src/ramda/fold.js +20 -0
  253. package/src/ramda/fold.test.js +51 -0
  254. package/src/ramda/index.d.ts +6 -0
  255. package/src/ramda/index.js +6 -0
  256. package/src/ramda/pipe.d.ts +13 -0
  257. package/src/ramda/pipe.js +27 -0
  258. package/src/ramda/pipe.test.js +77 -0
  259. package/src/ramda/unfold.d.ts +11 -0
  260. package/src/ramda/unfold.js +20 -0
  261. package/src/ramda/unfold.test.js +29 -0
  262. package/src/unquoted-json/ajax.test.js +1074 -0
  263. package/src/unquoted-json/index.d.ts +13 -0
  264. package/src/unquoted-json/index.js +12 -0
  265. package/src/unquoted-json/queryStringify.d.ts +8 -0
  266. package/src/unquoted-json/queryStringify.js +70 -0
  267. package/src/unquoted-json/queryStringify.test.js +110 -0
  268. package/src/unquoted-json/stringifyKey.d.ts +7 -0
  269. package/src/unquoted-json/stringifyKey.js +16 -0
  270. package/src/unquoted-json/stringifyKey.test.js +51 -0
  271. package/src/unquoted-json/stringifyStringValue.d.ts +7 -0
  272. package/src/unquoted-json/stringifyStringValue.js +17 -0
  273. package/src/unquoted-json/stringifyStringValue.test.js +52 -0
  274. package/src/unquoted-json/unquotedJsonStringify.d.ts +7 -0
  275. package/src/unquoted-json/unquotedJsonStringify.js +39 -0
  276. package/src/unquoted-json/unquotedJsonStringify.test.js +52 -0
  277. package/dist/hyperscript-rxjs.d.ts +0 -1412
  278. package/dist/hyperscript-rxjs.js +0 -1
  279. package/dist/tsdoc-metadata.json +0 -11
@@ -0,0 +1,36 @@
1
+ import { BehaviorSubject,Observable } from 'rxjs'
2
+ import { Deep } from './Deep'
3
+
4
+ test('test deep CombineLatest', done => {
5
+ const model = {
6
+ a: {
7
+ b: new BehaviorSubject(0),
8
+ c: new BehaviorSubject(1),
9
+ },
10
+ x: [new BehaviorSubject(2), new BehaviorSubject(3)]
11
+ }
12
+
13
+ let deep = Deep.fromBehaviorSubject(model)
14
+ deep.entries.forEach(([k, v]) => {
15
+ console.log(k)
16
+ console.log(v)
17
+ })
18
+
19
+ let obs = deep.combineLatest();
20
+
21
+ expect(obs).toBeInstanceOf(Observable)
22
+
23
+ obs.subscribe({
24
+ next: data => {
25
+ console.log(data.entries)
26
+ //states.push(data)
27
+ }
28
+ })
29
+
30
+ model.a.b.next(10)
31
+ model.a.c.next(11)
32
+
33
+ done()
34
+
35
+ })
36
+
@@ -0,0 +1,34 @@
1
+ import { BehaviorSubject, Observable } from 'rxjs'
2
+ import { Deep } from './Deep'
3
+
4
+ test('test deepMerge 1', done => {
5
+ let states = []
6
+
7
+ const source = {
8
+ a: {
9
+ b: new BehaviorSubject(0),
10
+ c: new BehaviorSubject(1),
11
+ },
12
+ x: [new BehaviorSubject(2), new BehaviorSubject(3)]
13
+ }
14
+ let deep = Deep.fromObservable(source)
15
+ let obs = deep.merge()
16
+ expect(obs).toBeInstanceOf(Observable)
17
+
18
+ obs.subscribe(data => { states.push(data) })
19
+
20
+ source.a.b.next(10)
21
+ source.x[1].next(13)
22
+
23
+ expect(states).toEqual([
24
+ [['a', 'b'], 0],
25
+ [['a', 'c'], 1],
26
+ [['x', 0], 2],
27
+ [['x', 1], 3],
28
+ [['a', 'b'], 10],
29
+ [['x', 1], 13],
30
+ ])
31
+
32
+ done()
33
+ })
34
+
@@ -0,0 +1,31 @@
1
+ import { Deep } from './Deep'
2
+
3
+ test('difference Deep test', () => {
4
+ let dp = new Deep([
5
+ [[0], 0],
6
+ [[1], 1]
7
+ ])
8
+ let keys = [[1], [2]]
9
+ let y = dp.difference(keys)
10
+ expect(y.entries).toEqual([[[0], 0]])
11
+ })
12
+
13
+
14
+ test('difference Deep test with 过滤掉 user 相关的键路径', () => {
15
+
16
+ const deep = new Deep([
17
+ [['settings', 'theme'], 'dark'],
18
+ [['user', 'age'], 30],
19
+ [['user', 'name'], '张三'],
20
+ ]);
21
+
22
+ let keys = [
23
+ ['user', 'age'],
24
+ ['user', 'name'],
25
+ ]
26
+ const filtered = deep.difference(keys)
27
+ expect(filtered.entries).toEqual([
28
+ [['settings', 'theme'], 'dark']
29
+ ])
30
+
31
+ })
@@ -0,0 +1,17 @@
1
+ import { Deep } from './Deep'
2
+
3
+ test('freshValueDeep', () => {
4
+ let entries = [
5
+ [['a'], 0], [['b'], 1],
6
+ [['c', 0], 2],
7
+ [['c', 1], 3],
8
+ [['c', 2, 'e'], 4]
9
+ ]
10
+
11
+ let deep = new Deep(entries)
12
+ let obj = { a: 5, b: 6, c: [7, 8, { e: 9 }] }
13
+ let y = deep.freshValue(obj)
14
+ let e = [[['a'], 5], [['b'], 6], [['c', 0], 7], [['c', 1], 8], [['c', 2, 'e'], 9]]
15
+
16
+ expect(y.entries).toEqual(e)
17
+ })
@@ -0,0 +1 @@
1
+ export * from "./Deep"
@@ -0,0 +1,2 @@
1
+ export * from "./Deep"
2
+
@@ -0,0 +1,25 @@
1
+ import { Deep } from './Deep'
2
+
3
+ test('test intersectDeep', () => {
4
+ let entries = [
5
+ [[0, 0], 0], //*
6
+ [[0, 1], 1],
7
+ [[1, 0], 2],
8
+ [[1, 1], 3], //*
9
+ ]
10
+ let deep = new Deep(entries)
11
+
12
+ let keys = [
13
+ [0, 0],
14
+ [1, 1],
15
+ ]
16
+
17
+ let y = deep.intersect(keys)
18
+
19
+ let e = [
20
+ [[0, 0], 0],
21
+ [[1, 1], 3],
22
+ ]
23
+
24
+ expect(y.entries).toEqual(e)
25
+ })
@@ -0,0 +1,13 @@
1
+ import { compareKeyPath } from '../comparison';
2
+
3
+ /**
4
+ * Returns a new entries array where each entry's key exists in the given keys array.
5
+ * @private
6
+ * @param entries - An array of entries, where each entry is a tuple [keyPath, value].
7
+ * @param keys - An array of key paths to intersect with.
8
+ * @returns A new array of entries whose keys are present in the keys array.
9
+ */
10
+ export function intersectEntries<T>(
11
+ entries: [(string|number)[],T][],
12
+ keys: (string|number)[][]
13
+ ): [(string|number)[],T][];
@@ -0,0 +1,37 @@
1
+ import { compareKeyPath } from "../comparison"
2
+
3
+ /**
4
+ * 返回一个新entries,每个entry的key都在keys中。
5
+ * @template T
6
+ * @param {[(string|number)[],T][]} entries
7
+ * @param {(string|number)[][]} keys
8
+ */
9
+ export function intersectEntries(entries, keys) {
10
+
11
+ /**
12
+ *
13
+ * @param {[(string|number)[],T][]} acc
14
+ * @param {[(string|number)[],T][]} entries
15
+ * @param {(string|number)[][]} keys
16
+ * @returns {[(string|number)[],T][]}
17
+ */
18
+ const loop = (acc, entries, keys) => {// 由intersect修改而来
19
+ if (entries.length === 0 || keys.length === 0) {
20
+ return acc
21
+ } else {
22
+ switch (Math.sign(compareKeyPath(entries[0][0], keys[0]))) {
23
+ case 0:
24
+ let yy = [...acc, entries[0]]
25
+ return loop(yy, entries.slice(1), keys.slice(1))
26
+
27
+ case -1:
28
+ return loop(acc, entries.slice(1), keys)
29
+
30
+ case 1:
31
+ default:
32
+ return loop(acc, entries, keys.slice(1))
33
+ }
34
+ }
35
+ }
36
+ return loop([], entries, keys)
37
+ }
@@ -0,0 +1,20 @@
1
+ import { intersectEntries } from './intersectEntries'
2
+
3
+ test('test intersectEntries', () => {
4
+ let x = [
5
+ [[0, 0], 0],
6
+ [[0, 1], 1],
7
+ [[1, 0], 2],
8
+ [[1, 1], 3]]
9
+
10
+ let keys = [
11
+ [0, 0],
12
+ [1, 1]
13
+ ]
14
+
15
+ let y = intersectEntries(x, keys)
16
+
17
+ let e = [[[0, 0], 0], [[1, 1], 3]]
18
+
19
+ expect(y).toEqual(e)
20
+ })
@@ -0,0 +1,31 @@
1
+ import { BehaviorSubject } from 'rxjs'
2
+ import { pluckProperty } from '../object'
3
+ import { Deep } from './Deep'
4
+
5
+
6
+ test('test objectToDeep', () => {
7
+ let observables = {
8
+ a: new BehaviorSubject(0),
9
+ c: [
10
+ new BehaviorSubject(0),
11
+ {
12
+ e: new BehaviorSubject(0),
13
+ },
14
+ ],
15
+ }
16
+
17
+ let deep = Deep.fromObject(observables, (v, k, p) => v instanceof BehaviorSubject)
18
+
19
+ let keys = [
20
+ ['a'],
21
+ ['c', 0],
22
+ ['c', 1, 'e'],
23
+ ]
24
+
25
+ expect(deep.keys).toEqual(keys)
26
+
27
+ let entries = keys.map(k => [k, pluckProperty(observables, k)])
28
+
29
+ expect(deep.entries).toEqual(entries)
30
+
31
+ })
@@ -0,0 +1,21 @@
1
+ import { Deep } from './Deep'
2
+
3
+ test('replaceValueDeep', () => {
4
+ let entries = [
5
+ [['a'], 0],
6
+ [['b'], 1],
7
+ [['c', 0], 2], [['c', 1], 3], [['c', 2, 'e'], 4]]
8
+
9
+ let deep = new Deep(entries)
10
+
11
+ let values = [5, 6, 7, 8, 9]
12
+
13
+ let y = deep.replaceValue(values)
14
+
15
+ let e = [
16
+ [['a'], 5],
17
+ [['b'], 6],
18
+ [['c', 0], 7], [['c', 1], 8], [['c', 2, 'e'], 9]]
19
+
20
+ expect(y.entries).toEqual(e)
21
+ })
@@ -0,0 +1,30 @@
1
+ import { Deep } from './Deep'
2
+
3
+ test('unionDeep test', () => {
4
+ let ent1 = [
5
+ [["a", "b"], 0],
6
+ [["a", "c"], 1], //*
7
+ ]
8
+
9
+ let ent2 = [
10
+ [["a", "c"], 'x'], //*
11
+ [["a", "d"], 2],
12
+ [["a", "e"], 3],
13
+ [["f"], 4],
14
+ ]
15
+
16
+ //a,b中的键不能重复
17
+ let deep1 = new Deep(ent1)
18
+ let deep2 = deep1.union(ent2)
19
+ let e = [
20
+ [["a", "b"], 0],
21
+ [["a", "c"], 1], //*
22
+ [["a", "c"], 'x'], //*
23
+ [["a", "d"], 2],
24
+ [["a", "e"], 3],
25
+ [["f"], 4],
26
+ ]
27
+
28
+ expect(deep2.entries).toEqual(e)
29
+ })
30
+
@@ -0,0 +1,21 @@
1
+ import { Deep } from './Deep'
2
+
3
+ test('zipValueDeep', () => {
4
+ let entries = [
5
+ [['a'], 0],
6
+ [['b'], 1],
7
+ [['c', 0], 2],
8
+ [['c', 1], 3],
9
+ [['c', 2, 'e'], 4]]
10
+ let deep = new Deep(entries)
11
+ let values = [5, 6, 7, 8, 9]
12
+ let y = deep.zipValue(values)
13
+ let e = [
14
+ [['a'], [0, 5]],
15
+ [['b'], [1, 6]],
16
+ [['c', 0], [2, 7]],
17
+ [['c', 1], [3, 8]],
18
+ [['c', 2, 'e'], [4, 9]]
19
+ ]
20
+ expect(y.entries).toEqual(e)
21
+ })
@@ -0,0 +1,55 @@
1
+ import { Subject, Observable } from 'rxjs';
2
+
3
+ /**
4
+ * ObservableArray 是一个可观察的数组,支持 insertBefore、removeChild、replaceChild 操作,
5
+ * 并通过 RxJS Subject 通知变化,适用于响应式 DOM 操作场景。
6
+ */
7
+ export class ObservableArray<T = any> extends Array<T> {
8
+ constructor(newItem: () => T);
9
+
10
+ /**
11
+ * 变化通知的 Subject。
12
+ * 事件元组类型: ['insertBefore', T, number] | ['removeChild', number] | ['replaceChild', T, number]
13
+ */
14
+ action$: Subject<['insertBefore', T, number] | ['removeChild', number] | ['replaceChild', T, number]>;
15
+
16
+ /**
17
+ * 插入元素事件流,发出 [item, index]。
18
+ */
19
+ insertBefore$: Observable<[T, number]>;
20
+
21
+ /**
22
+ * 删除元素事件流,发出 index。
23
+ */
24
+ removeChild$: Observable<number>;
25
+
26
+ /**
27
+ * 替换元素事件流,发出 [item, index]。
28
+ */
29
+ replaceChild$: Observable<[T, number]>;
30
+
31
+ /**
32
+ * 在指定位置插入元素,并通知变化。
33
+ * @param item 要插入的元素
34
+ * @param index 插入位置,默认为数组末尾
35
+ */
36
+ insertBefore(item: T, index?: number): void;
37
+
38
+ /**
39
+ * 删除指定位置的元素,并通知变化。
40
+ * @param index 删除位置,默认为数组末尾
41
+ */
42
+ removeChild(index?: number): void;
43
+
44
+ /**
45
+ * 替换指定位置的元素,并通知变化。
46
+ * @param item 新元素
47
+ * @param index 替换位置
48
+ */
49
+ replaceChild(item: T, index: number): void;
50
+
51
+ /**
52
+ * 附加一个默认子元素
53
+ */
54
+ appendChild(): void;
55
+ }
@@ -0,0 +1,94 @@
1
+ import { Subject } from 'rxjs'
2
+ import { filter, map } from 'rxjs/operators'
3
+ import { arrayInsert, arrayRemove } from '../array'
4
+
5
+ /**
6
+ * ObservableArray 是一个可观察的数组,支持 insertBefore、removeChild、replaceChild 操作,
7
+ * 并通过 RxJS Subject 通知变化,适用于响应式 DOM 操作场景。
8
+ *
9
+ * @template T
10
+ * @extends Array<T>
11
+ */
12
+ export class ObservableArray extends Array {
13
+ /**
14
+ * @constructor 创建一个 ObservableArray 实例。禁止传参。
15
+ * @param {()=>T} newItem
16
+ * @throws {Error} 如果传入参数则抛出异常。
17
+ */
18
+ constructor(newItem) {
19
+ super();
20
+ this.newitem = newItem
21
+
22
+ /**
23
+ * 变化通知的 Subject。
24
+ * @type {Subject<any[]>}
25
+ */
26
+ this.action$ = new Subject()
27
+
28
+ /**
29
+ * 插入元素事件流,发出 [item, index]。
30
+ * @type {import('rxjs').Observable<[T, number]>}
31
+ */
32
+ this.insertBefore$ =
33
+ this.action$.pipe(
34
+ filter(([action]) => action === 'insertBefore'),
35
+ map(([_, item, index]) => [item, index]),
36
+ )
37
+
38
+ /**
39
+ * 删除元素事件流,发出 index。
40
+ * @type {import('rxjs').Observable<number>}
41
+ */
42
+ this.removeChild$ =
43
+ this.action$.pipe(
44
+ filter(([action]) => action === 'removeChild'),
45
+ map(([_, index]) => index),
46
+ )
47
+
48
+ /**
49
+ * 替换元素事件流,发出 [item, index]。
50
+ * @type {import('rxjs').Observable<[T, number]>}
51
+ */
52
+ this.replaceChild$ =
53
+ this.action$.pipe(
54
+ filter(([action]) => action === 'replaceChild'),
55
+ map(([_, item, index]) => [item, index]),
56
+ )
57
+ }
58
+
59
+ /**
60
+ * 在指定位置插入元素,并通知变化。
61
+ * @param {T} item 要插入的元素
62
+ * @param {number} [index=this.length] 插入位置,默认为数组末尾
63
+ */
64
+ insertBefore(item, index = this.length) {
65
+ arrayInsert(this, item, index)
66
+ this.action$.next(['insertBefore', item, index])
67
+ }
68
+
69
+ /**
70
+ * 删除指定位置的元素,并通知变化。
71
+ * @param {number} [index=this.length-1] 删除位置,默认为数组末尾
72
+ */
73
+ removeChild(index = this.length - 1) {
74
+ arrayRemove(this, index)
75
+ this.action$.next(['removeChild', index])
76
+ }
77
+
78
+ /**
79
+ * 替换指定位置的元素,并通知变化。
80
+ * @param {T} item 新元素
81
+ * @param {number} index 替换位置
82
+ */
83
+ replaceChild(item, index) {
84
+ this[index] = item
85
+ this.action$.next(['replaceChild', item, index])
86
+ }
87
+ /**
88
+ * 附加一个默认子元素
89
+ */
90
+ appendChild(){
91
+ this.insertBefore(this.newitem(), this.length)
92
+ }
93
+
94
+ }
@@ -0,0 +1,117 @@
1
+ import { ObservableArray } from './ObservableArray'
2
+
3
+ test('ObservableArray is Array', () => {
4
+ let arr = new ObservableArray()
5
+ expect(Array.isArray(arr)).toEqual(true)
6
+ })
7
+
8
+ test('test insertBefore', done => {
9
+ let states = []
10
+ let arr = new ObservableArray()
11
+
12
+ arr.insertBefore$.subscribe(([item, index]) => { states.push(['insertBefore', item, index]) })
13
+ arr.insertBefore(4)
14
+ arr.insertBefore(3)
15
+ arr.insertBefore(2, 0)
16
+
17
+ expect(states).toEqual([
18
+ ['insertBefore', 4, 0],
19
+ ['insertBefore', 3, 1],
20
+ ['insertBefore', 2, 0],
21
+ ])
22
+
23
+ expect([...arr]).toEqual([2, 4, 3])
24
+ expect(arr.length).toEqual(3)
25
+
26
+ done()
27
+ })
28
+
29
+ test('test removeChild', done => {
30
+ let states = []
31
+ let arr = new ObservableArray()
32
+ arr.removeChild$.subscribe(index => { states.push(['removeChild', index]) })
33
+
34
+ arr.insertBefore(4)
35
+ arr.insertBefore(3)
36
+
37
+ expect([...arr]).toEqual([4, 3])
38
+ expect(arr.length).toEqual(2)
39
+ arr.removeChild()
40
+ arr.removeChild(0)
41
+ expect(arr.length).toEqual(0)
42
+
43
+ expect(states).toEqual([
44
+ ['removeChild', 1],
45
+ ['removeChild', 0],
46
+ ])
47
+
48
+ expect([...arr]).toEqual([])
49
+
50
+ done()
51
+ })
52
+
53
+ test('test default argument', done => {
54
+ let arr = new ObservableArray()
55
+
56
+ arr.insertBefore(4)
57
+ arr.insertBefore(3)
58
+
59
+ expect([...arr]).toEqual([4, 3])
60
+ arr.insertBefore(2)
61
+ expect([...arr]).toEqual([4, 3, 2])
62
+
63
+ arr.removeChild()
64
+ expect([...arr]).toEqual([4, 3])
65
+
66
+ arr.removeChild()
67
+ expect([...arr]).toEqual([4])
68
+
69
+
70
+ done()
71
+ })
72
+
73
+ test('test replaceChild', done => {
74
+ let states = []
75
+ let arr = new ObservableArray()
76
+
77
+ arr.replaceChild$.subscribe(([item, index]) => { states.push(['replaceChild', item, index]) })
78
+
79
+ arr.insertBefore(4)
80
+ arr.insertBefore(3)
81
+ arr.insertBefore(2, 0)
82
+
83
+ expect([...arr]).toEqual([2, 4, 3])
84
+
85
+ arr.replaceChild('4', 1)
86
+
87
+ expect(states).toEqual([
88
+ ['replaceChild', '4', 1],
89
+ ])
90
+
91
+ expect([...arr]).toEqual([2, '4', 3])
92
+
93
+ done()
94
+ })
95
+
96
+ test('test action', done => {
97
+ let states = []
98
+ let arr = new ObservableArray()
99
+
100
+ arr.action$.subscribe(a => { states.push(a) })
101
+
102
+ arr.insertBefore('a')
103
+ arr.replaceChild('b', 0)
104
+ arr.removeChild()
105
+
106
+ expect(states).toEqual([
107
+ ['insertBefore', 'a', 0],
108
+ ['replaceChild', 'b', 0],
109
+ ['removeChild', 0],
110
+
111
+ ])
112
+
113
+ expect([...arr]).toEqual([])
114
+
115
+ done()
116
+ })
117
+
@@ -0,0 +1,2 @@
1
+ export * from './isRxType'
2
+ export * from './ObservableArray'
@@ -0,0 +1,2 @@
1
+ export * from './isRxType'
2
+ export * from './ObservableArray'
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 检查对象是否为 RxJS 类型。
3
+ *
4
+ * `isRxType` 函数用于判断给定的对象是否为 RxJS 的 `Observable` 或 `Subscription` 类型。
5
+ *
6
+ * @param obj - 要检查的对象。
7
+ * @returns 如果对象是 `Observable` 或 `Subscription`,返回 `true`;否则返回 `false`。
8
+ */
9
+ export declare function isRxType(obj: any): boolean;
@@ -0,0 +1,15 @@
1
+ import { isObservable, Subscription } from 'rxjs'
2
+
3
+ /**
4
+ * 检查对象是否为 RxJS 类型。
5
+ *
6
+ * `isRxType` 函数用于判断给定的对象是否为 RxJS 的 `Observable` 或 `Subscription` 类型。
7
+ *
8
+ * @param {any} obj - 要检查的对象。
9
+ * @returns {boolean} - 如果对象是 `Observable` 或 `Subscription`,返回 `true`;否则返回 `false`。
10
+ *
11
+ */
12
+ export function isRxType(obj) {
13
+ return typeof obj === 'object' && obj &&
14
+ (isObservable(obj) || obj instanceof Subscription)
15
+ }
@@ -0,0 +1,43 @@
1
+ import { of, Subscription } from 'rxjs';
2
+ import { isRxType } from './isRxType';
3
+
4
+ describe('isRxType', () => {
5
+ test('should return true for an Observable', () => {
6
+ const observable = of(1);
7
+ expect(isRxType(observable)).toBe(true);
8
+ });
9
+
10
+ test('should return true for a Subscription', () => {
11
+ const subscription = new Subscription();
12
+ expect(isRxType(subscription)).toBe(true);
13
+ });
14
+
15
+ test('should return false for a plain object', () => {
16
+ const obj = {};
17
+ expect(isRxType(obj)).toBe(false);
18
+ });
19
+
20
+ test('should return null for null', () => {
21
+ expect(isRxType(null)).toBe(null);
22
+ });
23
+
24
+ test('should return false for undefined', () => {
25
+ expect(isRxType(undefined)).toBe(false);
26
+ });
27
+
28
+ test('should return false for a primitive value', () => {
29
+ expect(isRxType(42)).toBe(false);
30
+ expect(isRxType('string')).toBe(false);
31
+ expect(isRxType(true)).toBe(false);
32
+ });
33
+
34
+ test('should return false for a function', () => {
35
+ const func = () => {};
36
+ expect(isRxType(func)).toBe(false);
37
+ });
38
+
39
+ test('should return false for an array', () => {
40
+ const arr = [];
41
+ expect(isRxType(arr)).toBe(false);
42
+ });
43
+ });