com.fofx.observething 1.0.0

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 (117) hide show
  1. package/README.md +2 -0
  2. package/README.md.meta +7 -0
  3. package/Runtime/CollectionIdProvider.cs +72 -0
  4. package/Runtime/CollectionIdProvider.cs.meta +2 -0
  5. package/Runtime/IObservable.cs +66 -0
  6. package/Runtime/IObservable.cs.meta +2 -0
  7. package/Runtime/Implementations/Observable.cs +30 -0
  8. package/Runtime/Implementations/Observable.cs.meta +2 -0
  9. package/Runtime/Implementations/ObservableBase.cs +173 -0
  10. package/Runtime/Implementations/ObservableBase.cs.meta +2 -0
  11. package/Runtime/Implementations/ObservableCollection.cs +141 -0
  12. package/Runtime/Implementations/ObservableCollection.cs.meta +2 -0
  13. package/Runtime/Implementations/ObservableDictionary.cs +166 -0
  14. package/Runtime/Implementations/ObservableDictionary.cs.meta +2 -0
  15. package/Runtime/Implementations/ObservableList.cs +163 -0
  16. package/Runtime/Implementations/ObservableList.cs.meta +2 -0
  17. package/Runtime/Implementations/ObservableSet.cs +137 -0
  18. package/Runtime/Implementations/ObservableSet.cs.meta +2 -0
  19. package/Runtime/Implementations/ObservableValue.cs +59 -0
  20. package/Runtime/Implementations/ObservableValue.cs.meta +2 -0
  21. package/Runtime/Implementations.meta +8 -0
  22. package/Runtime/Observables/BatchObservable.cs +72 -0
  23. package/Runtime/Observables/BatchObservable.cs.meta +2 -0
  24. package/Runtime/Observables/CastObservable.cs +128 -0
  25. package/Runtime/Observables/CastObservable.cs.meta +2 -0
  26. package/Runtime/Observables/CombineObservable.cs +96 -0
  27. package/Runtime/Observables/CombineObservable.cs.meta +2 -0
  28. package/Runtime/Observables/CombineValueObservable.cs +319 -0
  29. package/Runtime/Observables/CombineValueObservable.cs.meta +2 -0
  30. package/Runtime/Observables/ConcatObservable.cs +75 -0
  31. package/Runtime/Observables/ConcatObservable.cs.meta +2 -0
  32. package/Runtime/Observables/ContainsObservable.cs +71 -0
  33. package/Runtime/Observables/ContainsObservable.cs.meta +2 -0
  34. package/Runtime/Observables/CountObservable.cs +29 -0
  35. package/Runtime/Observables/CountObservable.cs.meta +2 -0
  36. package/Runtime/Observables/DistinctObservable.cs +55 -0
  37. package/Runtime/Observables/DistinctObservable.cs.meta +2 -0
  38. package/Runtime/Observables/FirstObservable.cs +53 -0
  39. package/Runtime/Observables/FirstObservable.cs.meta +2 -0
  40. package/Runtime/Observables/IndexOfObservable.cs +83 -0
  41. package/Runtime/Observables/IndexOfObservable.cs.meta +2 -0
  42. package/Runtime/Observables/OperationStreamObservable.cs +194 -0
  43. package/Runtime/Observables/OperationStreamObservable.cs.meta +2 -0
  44. package/Runtime/Observables/OrderByObservable.cs +116 -0
  45. package/Runtime/Observables/OrderByObservable.cs.meta +2 -0
  46. package/Runtime/Observables/SelectCollectionObservable.cs +29 -0
  47. package/Runtime/Observables/SelectCollectionObservable.cs.meta +2 -0
  48. package/Runtime/Observables/SelectListObservable.cs +29 -0
  49. package/Runtime/Observables/SelectListObservable.cs.meta +2 -0
  50. package/Runtime/Observables/SelectManyObservable.cs +78 -0
  51. package/Runtime/Observables/SelectManyObservable.cs.meta +2 -0
  52. package/Runtime/Observables/SelectValueObservable.cs +28 -0
  53. package/Runtime/Observables/SelectValueObservable.cs.meta +2 -0
  54. package/Runtime/Observables/SkipWhileObservable.cs +32 -0
  55. package/Runtime/Observables/SkipWhileObservable.cs.meta +2 -0
  56. package/Runtime/Observables/ThenObservable.cs +209 -0
  57. package/Runtime/Observables/ThenObservable.cs.meta +2 -0
  58. package/Runtime/Observables/ToDictionaryObservable.cs +35 -0
  59. package/Runtime/Observables/ToDictionaryObservable.cs.meta +2 -0
  60. package/Runtime/Observables/TrackObservable.cs +74 -0
  61. package/Runtime/Observables/TrackObservable.cs.meta +2 -0
  62. package/Runtime/Observables/UnwrapCollectionObservable.cs +64 -0
  63. package/Runtime/Observables/UnwrapCollectionObservable.cs.meta +2 -0
  64. package/Runtime/Observables/UnwrapListObservable.cs +69 -0
  65. package/Runtime/Observables/UnwrapListObservable.cs.meta +2 -0
  66. package/Runtime/Observables/UnwrapValueObservable.cs +56 -0
  67. package/Runtime/Observables/UnwrapValueObservable.cs.meta +2 -0
  68. package/Runtime/Observables/WhereObservable.cs +85 -0
  69. package/Runtime/Observables/WhereObservable.cs.meta +2 -0
  70. package/Runtime/Observables/WithPreviousObservable.cs +36 -0
  71. package/Runtime/Observables/WithPreviousObservable.cs.meta +2 -0
  72. package/Runtime/Observables.cs +467 -0
  73. package/Runtime/Observables.cs.meta +2 -0
  74. package/Runtime/Observables.meta +8 -0
  75. package/Runtime/ObservationContext.cs +126 -0
  76. package/Runtime/ObservationContext.cs.meta +2 -0
  77. package/Runtime/Observers.cs +403 -0
  78. package/Runtime/Observers.cs.meta +2 -0
  79. package/Runtime/Operators/BatchOperator.cs +71 -0
  80. package/Runtime/Operators/BatchOperator.cs.meta +2 -0
  81. package/Runtime/Operators/CollectionOperator.cs +30 -0
  82. package/Runtime/Operators/CollectionOperator.cs.meta +2 -0
  83. package/Runtime/Operators/DictionaryOperator.cs +45 -0
  84. package/Runtime/Operators/DictionaryOperator.cs.meta +2 -0
  85. package/Runtime/Operators/IInitializationOperationsProvider.cs +10 -0
  86. package/Runtime/Operators/IInitializationOperationsProvider.cs.meta +2 -0
  87. package/Runtime/Operators/ListOperator.cs +44 -0
  88. package/Runtime/Operators/ListOperator.cs.meta +2 -0
  89. package/Runtime/Operators/ObservableOperator.cs +75 -0
  90. package/Runtime/Operators/ObservableOperator.cs.meta +2 -0
  91. package/Runtime/Operators/Operator.cs +65 -0
  92. package/Runtime/Operators/Operator.cs.meta +2 -0
  93. package/Runtime/Operators/SetOperator.cs +44 -0
  94. package/Runtime/Operators/SetOperator.cs.meta +2 -0
  95. package/Runtime/Operators/ValueOperator.cs +30 -0
  96. package/Runtime/Operators/ValueOperator.cs.meta +2 -0
  97. package/Runtime/Operators.meta +8 -0
  98. package/Runtime/PriorityQueue.cs +1096 -0
  99. package/Runtime/PriorityQueue.cs.meta +2 -0
  100. package/Runtime/com.fofx.observething.asmdef +14 -0
  101. package/Runtime/com.fofx.observething.asmdef.meta +7 -0
  102. package/Runtime.meta +8 -0
  103. package/Tests/CollectionObservableTests.cs +739 -0
  104. package/Tests/CollectionObservableTests.cs.meta +2 -0
  105. package/Tests/DictionaryObservableTests.cs +85 -0
  106. package/Tests/DictionaryObservableTests.cs.meta +2 -0
  107. package/Tests/ListObservableTests.cs +148 -0
  108. package/Tests/ListObservableTests.cs.meta +2 -0
  109. package/Tests/ObservationContextTests.cs +359 -0
  110. package/Tests/ObservationContextTests.cs.meta +2 -0
  111. package/Tests/ValueObservableTests.cs +322 -0
  112. package/Tests/ValueObservableTests.cs.meta +2 -0
  113. package/Tests/com.fofx.observething.tests.asmdef +24 -0
  114. package/Tests/com.fofx.observething.tests.asmdef.meta +7 -0
  115. package/Tests.meta +8 -0
  116. package/package.json +24 -0
  117. package/package.json.meta +7 -0
@@ -0,0 +1,322 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.Linq;
4
+ using NUnit.Framework;
5
+ using UnityEngine;
6
+ using UnityEngine.TestTools;
7
+
8
+ namespace ObserveThing.Tests
9
+ {
10
+ public class ObservableValueTests
11
+ {
12
+ [SetUp]
13
+ public void SetUp()
14
+ {
15
+ Settings.DefaultExceptionHandler = UnityEngine.Debug.LogException;
16
+ }
17
+
18
+ [Test]
19
+ public void TestErrorLogging()
20
+ {
21
+ var source = new ObservableValue<bool>();
22
+ var errorSelect = source
23
+ .ObservableSelect(x => x)
24
+ .ObservableSelect(x => x)
25
+ .ObservableSelect(x => x)
26
+ .ObservableSelect(x =>
27
+ {
28
+ if (x)
29
+ throw new Exception("This is an exception");
30
+
31
+ return x;
32
+ });
33
+
34
+ var errorObservable = errorSelect.Subscribe();
35
+
36
+ LogAssert.Expect(UnityEngine.LogType.Exception, "Exception: This is an exception");
37
+ source.value = true;
38
+
39
+ errorObservable.Dispose();
40
+ source.value = false;
41
+
42
+ errorObservable = errorSelect.Subscribe(
43
+ onError: exc => UnityEngine.Debug.Log("Got exception")
44
+ );
45
+
46
+ LogAssert.Expect(UnityEngine.LogType.Log, "Got exception");
47
+ source.value = true;
48
+ }
49
+
50
+ [Test]
51
+ public void TestSelect()
52
+ {
53
+ int callCount = 0;
54
+ int result = 0;
55
+
56
+ Exception exception = null;
57
+ bool disposed = false;
58
+
59
+ var toggle = new ObservableValue<bool>();
60
+ var selectObservable = toggle
61
+ .ObservableSelect(x => x ? 0 : 1)
62
+ .Subscribe(
63
+ x =>
64
+ {
65
+ callCount++;
66
+ result = x;
67
+ },
68
+ exc => exception = exc,
69
+ () => disposed = true
70
+ );
71
+
72
+ // init call
73
+ Assert.AreEqual(1, callCount);
74
+ Assert.AreEqual(1, result);
75
+
76
+ toggle.value = true;
77
+ Assert.AreEqual(2, callCount);
78
+ Assert.AreEqual(0, result);
79
+
80
+ toggle.value = false;
81
+ Assert.AreEqual(3, callCount);
82
+ Assert.AreEqual(1, result);
83
+
84
+ toggle.value = false;
85
+ Assert.AreEqual(3, callCount);
86
+ Assert.AreEqual(1, result);
87
+
88
+ toggle.Dispose();
89
+ Assert.IsTrue(disposed);
90
+
91
+ Assert.Throws(typeof(ObjectDisposedException), () => toggle.value = true);
92
+ Assert.AreEqual(3, callCount);
93
+ }
94
+
95
+ [Test]
96
+ public void TestSelectRaisesException()
97
+ {
98
+ Exception exception = null;
99
+ var source = new ObservableValue<bool>();
100
+ var selectChain = source.ObservableSelect(x => x).ObservableSelect(x => x);
101
+
102
+ var stream = selectChain.Subscribe(
103
+ onNext: x =>
104
+ {
105
+ if (x)
106
+ throw new Exception("This is an exception");
107
+ },
108
+ onError: exc => exception = exc
109
+ );
110
+
111
+ source.value = true;
112
+ Assert.IsNotNull(exception);
113
+
114
+ exception = null;
115
+
116
+ source.value = false;
117
+ Assert.IsNull(exception);
118
+
119
+ stream.Dispose();
120
+
121
+ source.value = true;
122
+ Assert.IsNull(exception);
123
+
124
+ source.value = false;
125
+ Assert.IsNull(exception);
126
+
127
+ stream = selectChain.Subscribe(
128
+ onNext: x =>
129
+ {
130
+ if (x)
131
+ throw new Exception("This is an exception");
132
+ }
133
+ );
134
+
135
+ LogAssert.Expect(UnityEngine.LogType.Exception, "Exception: This is an exception");
136
+ source.value = true;
137
+ }
138
+
139
+ [Test]
140
+ public void TestWithPrevious()
141
+ {
142
+ bool disposed = false;
143
+ bool receivedCall = false;
144
+ int currentValue = 0;
145
+ int previousValue = 0;
146
+ var source = new ObservableValue<int>();
147
+ var stream = source.ObservableWithPrevious().Subscribe(
148
+ onNext: x =>
149
+ {
150
+ currentValue = x.current;
151
+ previousValue = x.previous;
152
+ },
153
+ onDispose: () => disposed = true
154
+ );
155
+
156
+ Assert.AreEqual(currentValue, 0);
157
+ Assert.AreEqual(previousValue, 0);
158
+
159
+ source.value = 1;
160
+
161
+ Assert.AreEqual(currentValue, 1);
162
+ Assert.AreEqual(previousValue, 0);
163
+
164
+ source.value = 2;
165
+
166
+ Assert.AreEqual(currentValue, 2);
167
+ Assert.AreEqual(previousValue, 1);
168
+
169
+ receivedCall = false;
170
+ stream.Dispose();
171
+ Assert.IsTrue(disposed);
172
+ source.value = 100;
173
+ Assert.IsFalse(receivedCall);
174
+ }
175
+
176
+ [Test]
177
+ public void TestShallowCopy()
178
+ {
179
+ var result = 0;
180
+ var nestedSource = new ObservableValue<int>(10);
181
+ var source = new ObservableValue<IValueObservable<int>>(nestedSource);
182
+ bool disposed = false;
183
+ bool receivedCall = false;
184
+ var d = source.ObservableSelect(x => x.AsObservable());
185
+ var subscription = source.ObservableUnwrap().Subscribe(
186
+ onNext: x =>
187
+ {
188
+ result = x;
189
+ receivedCall = true;
190
+ },
191
+ onDispose: () => disposed = true
192
+ );
193
+
194
+ Assert.AreEqual(10, result);
195
+
196
+ nestedSource.value = 100;
197
+
198
+ Assert.AreEqual(100, result);
199
+
200
+ source.value = new ObservableValue<int>(-3);
201
+
202
+ Assert.AreEqual(-3, result);
203
+
204
+ nestedSource.value = 2;
205
+
206
+ Assert.AreEqual(-3, result);
207
+
208
+ source.value = null;
209
+
210
+ Assert.AreEqual(0, result);
211
+
212
+ source.value = nestedSource;
213
+
214
+ Assert.AreEqual(2, result);
215
+
216
+ receivedCall = false;
217
+ subscription.Dispose();
218
+ Assert.IsTrue(disposed);
219
+ nestedSource.value = 100;
220
+ Assert.IsFalse(receivedCall);
221
+ Assert.AreEqual(2, result);
222
+ }
223
+
224
+ [Test]
225
+ public void TestImmediateObserverOrder()
226
+ {
227
+ ObservableValue<int> observable = new ObservableValue<int>();
228
+ bool streamCalledFirst = false;
229
+ bool immediateStreamCalledFirst = false;
230
+ var chainedObservable = observable.ObservableSelect(x => x * 2);
231
+
232
+ var stream = chainedObservable.Subscribe(
233
+ onNext: x =>
234
+ {
235
+ if (!immediateStreamCalledFirst)
236
+ streamCalledFirst = true;
237
+ },
238
+ onDispose: () =>
239
+ {
240
+ if (!immediateStreamCalledFirst)
241
+ streamCalledFirst = true;
242
+ }
243
+ );
244
+
245
+ var immediateStream = chainedObservable.Subscribe(
246
+ immediate: true,
247
+ onNext: x =>
248
+ {
249
+ if (!streamCalledFirst)
250
+ immediateStreamCalledFirst = true;
251
+ },
252
+ onDispose: () =>
253
+ {
254
+ if (!streamCalledFirst)
255
+ immediateStreamCalledFirst = true;
256
+ }
257
+ );
258
+
259
+ streamCalledFirst = false;
260
+ immediateStreamCalledFirst = false;
261
+
262
+ observable.value++;
263
+
264
+ Assert.IsTrue(immediateStreamCalledFirst);
265
+ Assert.IsFalse(streamCalledFirst);
266
+
267
+ streamCalledFirst = false;
268
+ immediateStreamCalledFirst = false;
269
+
270
+ observable.Dispose();
271
+
272
+ Assert.IsTrue(immediateStreamCalledFirst);
273
+ Assert.IsFalse(streamCalledFirst);
274
+ }
275
+
276
+ [Test]
277
+ public void TestImmediateSubscription()
278
+ {
279
+ ObservableValue<int> observable = new ObservableValue<int>();
280
+
281
+ bool standardFired = false;
282
+ bool immediateFired = false;
283
+
284
+ bool standardFiredFirst = false;
285
+ bool immediateFiredFirst = false;
286
+
287
+ var standardStream = observable.Subscribe(
288
+ onNext: x =>
289
+ {
290
+ standardFired = true;
291
+
292
+ if (!immediateFiredFirst)
293
+ standardFiredFirst = true;
294
+ }
295
+ );
296
+
297
+ var immediateStream = observable.Subscribe(
298
+ immediate: true,
299
+ onNext: x =>
300
+ {
301
+ immediateFired = true;
302
+
303
+ if (!standardFiredFirst)
304
+ immediateFiredFirst = true;
305
+ }
306
+ );
307
+
308
+ standardFired = false;
309
+ immediateFired = false;
310
+
311
+ standardFiredFirst = false;
312
+ immediateFiredFirst = false;
313
+
314
+ observable.value = 1;
315
+
316
+ Assert.IsTrue(standardFired);
317
+ Assert.IsTrue(immediateFired);
318
+ Assert.IsTrue(immediateFiredFirst);
319
+ Assert.IsFalse(standardFiredFirst);
320
+ }
321
+ }
322
+ }
@@ -0,0 +1,2 @@
1
+ fileFormatVersion: 2
2
+ guid: 7b1583b136ecdfd4bbb60bb53181d3bc
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "ObserveThing.Tests",
3
+ "rootNamespace": "",
4
+ "references": [
5
+ "UnityEngine.TestRunner",
6
+ "UnityEditor.TestRunner",
7
+ "ObserveThing"
8
+ ],
9
+ "includePlatforms": [
10
+ "Editor"
11
+ ],
12
+ "excludePlatforms": [],
13
+ "allowUnsafeCode": false,
14
+ "overrideReferences": true,
15
+ "precompiledReferences": [
16
+ "nunit.framework.dll"
17
+ ],
18
+ "autoReferenced": false,
19
+ "defineConstraints": [
20
+ "UNITY_INCLUDE_TESTS"
21
+ ],
22
+ "versionDefines": [],
23
+ "noEngineReferences": false
24
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 2d1f165c65c945b42a1d7cff671b382b
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
package/Tests.meta ADDED
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 80dccb6759bb2ce478581c23242a5d0f
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "com.fofx.observething",
3
+ "version": "1.0.0",
4
+ "description": "An observable event stream library.",
5
+ "keywords": [
6
+ "observability",
7
+ "event stream",
8
+ "linq",
9
+ "C#",
10
+ "csharp"
11
+ ],
12
+ "homepage": "https://github.com/outernet-foundation/ObserveThing#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/outernet-foundation/ObserveThing/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/outernet-foundation/ObserveThing.git"
19
+ },
20
+ "license": "MIT",
21
+ "author": "Elliot Pjecha <epjecha@gmail.com>",
22
+ "displayName": "ObserveThing",
23
+ "unity": "6000.0"
24
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 933d3d97ef4a4d2439b3adc91b985026
3
+ PackageManifestImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant: