com.fofx.observething 1.0.0 → 1.1.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 (103) hide show
  1. package/README.md +1 -1
  2. package/Runtime/CollectionIdProvider.cs +71 -71
  3. package/Runtime/CollectionIdProvider.cs.meta +1 -1
  4. package/Runtime/IObservable.cs +66 -66
  5. package/Runtime/IObservable.cs.meta +1 -1
  6. package/Runtime/Implementations/Observable.cs +29 -29
  7. package/Runtime/Implementations/Observable.cs.meta +1 -1
  8. package/Runtime/Implementations/ObservableBase.cs +172 -172
  9. package/Runtime/Implementations/ObservableBase.cs.meta +1 -1
  10. package/Runtime/Implementations/ObservableCollection.cs +140 -140
  11. package/Runtime/Implementations/ObservableCollection.cs.meta +1 -1
  12. package/Runtime/Implementations/ObservableDictionary.cs +165 -165
  13. package/Runtime/Implementations/ObservableDictionary.cs.meta +1 -1
  14. package/Runtime/Implementations/ObservableList.cs +162 -162
  15. package/Runtime/Implementations/ObservableList.cs.meta +1 -1
  16. package/Runtime/Implementations/ObservableSet.cs +136 -136
  17. package/Runtime/Implementations/ObservableSet.cs.meta +1 -1
  18. package/Runtime/Implementations/ObservableValue.cs +58 -58
  19. package/Runtime/Implementations/ObservableValue.cs.meta +1 -1
  20. package/Runtime/Observables/BatchObservable.cs +71 -71
  21. package/Runtime/Observables/BatchObservable.cs.meta +1 -1
  22. package/Runtime/Observables/CastObservable.cs +127 -127
  23. package/Runtime/Observables/CastObservable.cs.meta +1 -1
  24. package/Runtime/Observables/CombineObservable.cs +95 -95
  25. package/Runtime/Observables/CombineObservable.cs.meta +1 -1
  26. package/Runtime/Observables/CombineValueObservable.cs +318 -318
  27. package/Runtime/Observables/CombineValueObservable.cs.meta +1 -1
  28. package/Runtime/Observables/ConcatObservable.cs +74 -74
  29. package/Runtime/Observables/ConcatObservable.cs.meta +1 -1
  30. package/Runtime/Observables/ContainsObservable.cs +70 -70
  31. package/Runtime/Observables/ContainsObservable.cs.meta +1 -1
  32. package/Runtime/Observables/CountObservable.cs +29 -29
  33. package/Runtime/Observables/CountObservable.cs.meta +1 -1
  34. package/Runtime/Observables/DistinctObservable.cs +54 -54
  35. package/Runtime/Observables/DistinctObservable.cs.meta +1 -1
  36. package/Runtime/Observables/FirstObservable.cs +52 -52
  37. package/Runtime/Observables/FirstObservable.cs.meta +1 -1
  38. package/Runtime/Observables/IndexOfObservable.cs +82 -82
  39. package/Runtime/Observables/IndexOfObservable.cs.meta +1 -1
  40. package/Runtime/Observables/OperationStreamObservable.cs +193 -193
  41. package/Runtime/Observables/OperationStreamObservable.cs.meta +1 -1
  42. package/Runtime/Observables/OrderByObservable.cs +115 -116
  43. package/Runtime/Observables/OrderByObservable.cs.meta +1 -1
  44. package/Runtime/Observables/SelectCollectionObservable.cs +28 -28
  45. package/Runtime/Observables/SelectCollectionObservable.cs.meta +1 -1
  46. package/Runtime/Observables/SelectListObservable.cs +28 -28
  47. package/Runtime/Observables/SelectListObservable.cs.meta +1 -1
  48. package/Runtime/Observables/SelectManyObservable.cs +77 -77
  49. package/Runtime/Observables/SelectManyObservable.cs.meta +1 -1
  50. package/Runtime/Observables/SelectValueObservable.cs +27 -27
  51. package/Runtime/Observables/SelectValueObservable.cs.meta +1 -1
  52. package/Runtime/Observables/SkipWhileObservable.cs +31 -31
  53. package/Runtime/Observables/SkipWhileObservable.cs.meta +1 -1
  54. package/Runtime/Observables/ThenObservable.cs +208 -208
  55. package/Runtime/Observables/ThenObservable.cs.meta +1 -1
  56. package/Runtime/Observables/ToDictionaryObservable.cs +35 -35
  57. package/Runtime/Observables/ToDictionaryObservable.cs.meta +1 -1
  58. package/Runtime/Observables/TrackObservable.cs +74 -74
  59. package/Runtime/Observables/TrackObservable.cs.meta +1 -1
  60. package/Runtime/Observables/UnwrapCollectionObservable.cs +63 -63
  61. package/Runtime/Observables/UnwrapCollectionObservable.cs.meta +1 -1
  62. package/Runtime/Observables/UnwrapListObservable.cs +69 -69
  63. package/Runtime/Observables/UnwrapListObservable.cs.meta +1 -1
  64. package/Runtime/Observables/UnwrapValueObservable.cs +55 -55
  65. package/Runtime/Observables/UnwrapValueObservable.cs.meta +1 -1
  66. package/Runtime/Observables/WhereObservable.cs +84 -84
  67. package/Runtime/Observables/WhereObservable.cs.meta +1 -1
  68. package/Runtime/Observables/WithPreviousObservable.cs +36 -36
  69. package/Runtime/Observables/WithPreviousObservable.cs.meta +1 -1
  70. package/Runtime/Observables.cs +466 -466
  71. package/Runtime/Observables.meta +8 -8
  72. package/Runtime/ObservationContext.cs +125 -125
  73. package/Runtime/ObservationContext.cs.meta +1 -1
  74. package/Runtime/Observers.cs +402 -402
  75. package/Runtime/Observers.cs.meta +1 -1
  76. package/Runtime/Operators/BatchOperator.cs +70 -70
  77. package/Runtime/Operators/BatchOperator.cs.meta +1 -1
  78. package/Runtime/Operators/CollectionOperator.cs +30 -30
  79. package/Runtime/Operators/CollectionOperator.cs.meta +1 -1
  80. package/Runtime/Operators/DictionaryOperator.cs +45 -45
  81. package/Runtime/Operators/DictionaryOperator.cs.meta +1 -1
  82. package/Runtime/Operators/IInitializationOperationsProvider.cs +10 -10
  83. package/Runtime/Operators/IInitializationOperationsProvider.cs.meta +1 -1
  84. package/Runtime/Operators/ListOperator.cs +44 -44
  85. package/Runtime/Operators/ListOperator.cs.meta +1 -1
  86. package/Runtime/Operators/ObservableOperator.cs +74 -74
  87. package/Runtime/Operators/ObservableOperator.cs.meta +1 -1
  88. package/Runtime/Operators/Operator.cs +65 -65
  89. package/Runtime/Operators/Operator.cs.meta +1 -1
  90. package/Runtime/Operators/SetOperator.cs +44 -44
  91. package/Runtime/Operators/SetOperator.cs.meta +1 -1
  92. package/Runtime/Operators/ValueOperator.cs +29 -29
  93. package/Runtime/Operators/ValueOperator.cs.meta +1 -1
  94. package/Runtime/Operators.meta +8 -8
  95. package/Runtime/PriorityQueue.cs +1095 -1095
  96. package/Runtime/PriorityQueue.cs.meta +1 -1
  97. package/Tests/CollectionObservableTests.cs +738 -738
  98. package/Tests/DictionaryObservableTests.cs +84 -84
  99. package/Tests/ListObservableTests.cs +147 -147
  100. package/Tests/ObservationContextTests.cs +359 -359
  101. package/Tests/ObservationContextTests.cs.meta +1 -1
  102. package/Tests/ValueObservableTests.cs +321 -321
  103. package/package.json +24 -24
@@ -1,75 +1,75 @@
1
- using System;
2
- using System.Collections.Generic;
3
-
4
- namespace ObserveThing
5
- {
6
- public class ConcatObservable<T> : IDisposable
7
- {
8
- private ObservableCollection<T> _operand;
9
- private CollectionIdProvider _idProvider;
10
- private Dictionary<uint, uint> _source1IdMap = new Dictionary<uint, uint>();
11
- private Dictionary<uint, uint> _source2IdMap = new Dictionary<uint, uint>();
12
-
13
- private IDisposable _subscription;
14
-
15
- public ConcatObservable(ICollectionObservable<T> source1, ICollectionObservable<T> source2, ObservableCollection<T> operand)
16
- {
17
- _idProvider = new CollectionIdProvider(x => !_source1IdMap.ContainsValue(x) && !_source2IdMap.ContainsValue(x));
18
- _operand = operand;
19
- _subscription = new ComposedDisposable(
20
-
21
- source1.SubscribeWithId(
22
- onAdd: Source1HandleAdd,
23
- onRemove: Source1HandleRemove,
24
- onError: _operand.OnError,
25
- onDispose: Dispose,
26
- immediate: true
27
- ),
28
-
29
- source2.SubscribeWithId(
30
- onAdd: Source2HandleAdd,
31
- onRemove: Source2HandleRemove,
32
- onError: _operand.OnError,
33
- onDispose: Dispose,
34
- immediate: true
35
- )
36
-
37
- );
38
- }
39
-
40
- private void Source1HandleAdd(uint id, T value)
41
- {
42
- var newId = _idProvider.GetUnusedId();
43
- _source1IdMap.Add(id, newId);
44
- _operand.Add(newId, value);
45
- }
46
-
47
- private void Source1HandleRemove(uint id, T value)
48
- {
49
- var newId = _source1IdMap[id];
50
- _source1IdMap.Remove(id);
51
- _operand.Remove(newId);
52
- }
53
-
54
- private void Source2HandleAdd(uint id, T value)
55
- {
56
- var newId = _idProvider.GetUnusedId();
57
- _source2IdMap.Add(id, newId);
58
- _operand.Add(newId, value);
59
- }
60
-
61
- private void Source2HandleRemove(uint id, T value)
62
- {
63
- var newId = _source2IdMap[id];
64
- _source2IdMap.Remove(id);
65
- _operand.Remove(newId);
66
- }
67
-
68
- public void Dispose()
69
- {
70
- _subscription?.Dispose();
71
- _subscription = null;
72
- _operand.Dispose();
73
- }
74
- }
1
+ using System;
2
+ using System.Collections.Generic;
3
+
4
+ namespace ObserveThing
5
+ {
6
+ public class ConcatObservable<T> : IDisposable
7
+ {
8
+ private ObservableCollection<T> _operand;
9
+ private CollectionIdProvider _idProvider;
10
+ private Dictionary<uint, uint> _source1IdMap = new Dictionary<uint, uint>();
11
+ private Dictionary<uint, uint> _source2IdMap = new Dictionary<uint, uint>();
12
+
13
+ private IDisposable _subscription;
14
+
15
+ public ConcatObservable(ICollectionObservable<T> source1, ICollectionObservable<T> source2, ObservableCollection<T> operand)
16
+ {
17
+ _idProvider = new CollectionIdProvider(x => !_source1IdMap.ContainsValue(x) && !_source2IdMap.ContainsValue(x));
18
+ _operand = operand;
19
+ _subscription = new ComposedDisposable(
20
+
21
+ source1.SubscribeWithId(
22
+ onAdd: Source1HandleAdd,
23
+ onRemove: Source1HandleRemove,
24
+ onError: _operand.OnError,
25
+ onDispose: Dispose,
26
+ immediate: true
27
+ ),
28
+
29
+ source2.SubscribeWithId(
30
+ onAdd: Source2HandleAdd,
31
+ onRemove: Source2HandleRemove,
32
+ onError: _operand.OnError,
33
+ onDispose: Dispose,
34
+ immediate: true
35
+ )
36
+
37
+ );
38
+ }
39
+
40
+ private void Source1HandleAdd(uint id, T value)
41
+ {
42
+ var newId = _idProvider.GetUnusedId();
43
+ _source1IdMap.Add(id, newId);
44
+ _operand.Add(newId, value);
45
+ }
46
+
47
+ private void Source1HandleRemove(uint id, T value)
48
+ {
49
+ var newId = _source1IdMap[id];
50
+ _source1IdMap.Remove(id);
51
+ _operand.Remove(newId);
52
+ }
53
+
54
+ private void Source2HandleAdd(uint id, T value)
55
+ {
56
+ var newId = _idProvider.GetUnusedId();
57
+ _source2IdMap.Add(id, newId);
58
+ _operand.Add(newId, value);
59
+ }
60
+
61
+ private void Source2HandleRemove(uint id, T value)
62
+ {
63
+ var newId = _source2IdMap[id];
64
+ _source2IdMap.Remove(id);
65
+ _operand.Remove(newId);
66
+ }
67
+
68
+ public void Dispose()
69
+ {
70
+ _subscription?.Dispose();
71
+ _subscription = null;
72
+ _operand.Dispose();
73
+ }
74
+ }
75
75
  }
@@ -1,2 +1,2 @@
1
- fileFormatVersion: 2
1
+ fileFormatVersion: 2
2
2
  guid: da034c02eb7fbd24aa52343dd5d2eca9
@@ -1,71 +1,71 @@
1
- using System;
2
- using System.Collections.Generic;
3
-
4
- namespace ObserveThing
5
- {
6
- public class ContainsObservable<T> : IDisposable
7
- {
8
- private ObservableValue<bool> _operand;
9
- private List<T> _list = new List<T>();
10
- private T _latest = default;
11
- private IDisposable _subscriptions;
12
-
13
- public ContainsObservable(ICollectionObservable<T> source, IValueObservable<T> value, ObservableValue<bool> operand)
14
- {
15
- _operand = operand;
16
- _subscriptions = new ComposedDisposable(
17
-
18
- source.Subscribe(
19
- onAdd: HandleAdd,
20
- onRemove: HandleRemove,
21
- onError: _operand.OnError,
22
- onDispose: Dispose,
23
- immediate: true
24
- ),
25
-
26
- value.Subscribe(
27
- onNext: HandleNext,
28
- onError: _operand.OnError,
29
- onDispose: Dispose,
30
- immediate: true
31
- )
32
-
33
- );
34
- }
35
-
36
- private void HandleAdd(T element)
37
- {
38
- _list.Add(element);
39
-
40
- if (_operand.value)
41
- return;
42
-
43
- if (Equals(element, _latest))
44
- _operand.value = true;
45
- }
46
-
47
- private void HandleRemove(T element)
48
- {
49
- _list.Remove(element);
50
-
51
- if (!_operand.value)
52
- return;
53
-
54
- if (Equals(element, _latest) && !_list.Contains(element))
55
- _operand.value = false;
56
- }
57
-
58
- private void HandleNext(T value)
59
- {
60
- _latest = value;
61
- _operand.value = _list.Contains(value);
62
- }
63
-
64
- public void Dispose()
65
- {
66
- _subscriptions?.Dispose();
67
- _subscriptions = null;
68
- _operand.Dispose();
69
- }
70
- }
1
+ using System;
2
+ using System.Collections.Generic;
3
+
4
+ namespace ObserveThing
5
+ {
6
+ public class ContainsObservable<T> : IDisposable
7
+ {
8
+ private ObservableValue<bool> _operand;
9
+ private List<T> _list = new List<T>();
10
+ private T _latest = default;
11
+ private IDisposable _subscriptions;
12
+
13
+ public ContainsObservable(ICollectionObservable<T> source, IValueObservable<T> value, ObservableValue<bool> operand)
14
+ {
15
+ _operand = operand;
16
+ _subscriptions = new ComposedDisposable(
17
+
18
+ source.Subscribe(
19
+ onAdd: HandleAdd,
20
+ onRemove: HandleRemove,
21
+ onError: _operand.OnError,
22
+ onDispose: Dispose,
23
+ immediate: true
24
+ ),
25
+
26
+ value.Subscribe(
27
+ onNext: HandleNext,
28
+ onError: _operand.OnError,
29
+ onDispose: Dispose,
30
+ immediate: true
31
+ )
32
+
33
+ );
34
+ }
35
+
36
+ private void HandleAdd(T element)
37
+ {
38
+ _list.Add(element);
39
+
40
+ if (_operand.value)
41
+ return;
42
+
43
+ if (Equals(element, _latest))
44
+ _operand.value = true;
45
+ }
46
+
47
+ private void HandleRemove(T element)
48
+ {
49
+ _list.Remove(element);
50
+
51
+ if (!_operand.value)
52
+ return;
53
+
54
+ if (Equals(element, _latest) && !_list.Contains(element))
55
+ _operand.value = false;
56
+ }
57
+
58
+ private void HandleNext(T value)
59
+ {
60
+ _latest = value;
61
+ _operand.value = _list.Contains(value);
62
+ }
63
+
64
+ public void Dispose()
65
+ {
66
+ _subscriptions?.Dispose();
67
+ _subscriptions = null;
68
+ _operand.Dispose();
69
+ }
70
+ }
71
71
  }
@@ -1,2 +1,2 @@
1
- fileFormatVersion: 2
1
+ fileFormatVersion: 2
2
2
  guid: 8007fd4897c313b408cb6a42f4583fe8
@@ -1,29 +1,29 @@
1
- using System;
2
-
3
- namespace ObserveThing
4
- {
5
- public class CountObservable<T> : IDisposable
6
- {
7
- private ObservableValue<int> _operand;
8
- private IDisposable _subscriptions;
9
-
10
- public CountObservable(ICollectionObservable<T> source, ObservableValue<int> operand)
11
- {
12
- _operand = operand;
13
- _subscriptions = source.Subscribe(
14
- onAdd: _ => operand.value = operand.value + 1,
15
- onRemove: _ => operand.value = operand.value - 1,
16
- onError: operand.OnError,
17
- onDispose: Dispose,
18
- immediate: true
19
- );
20
- }
21
-
22
- public void Dispose()
23
- {
24
- _subscriptions?.Dispose();
25
- _subscriptions = null;
26
- _operand.Dispose();
27
- }
28
- }
29
- }
1
+ using System;
2
+
3
+ namespace ObserveThing
4
+ {
5
+ public class CountObservable<T> : IDisposable
6
+ {
7
+ private ObservableValue<int> _operand;
8
+ private IDisposable _subscriptions;
9
+
10
+ public CountObservable(ICollectionObservable<T> source, ObservableValue<int> operand)
11
+ {
12
+ _operand = operand;
13
+ _subscriptions = source.Subscribe(
14
+ onAdd: _ => operand.value = operand.value + 1,
15
+ onRemove: _ => operand.value = operand.value - 1,
16
+ onError: operand.OnError,
17
+ onDispose: Dispose,
18
+ immediate: true
19
+ );
20
+ }
21
+
22
+ public void Dispose()
23
+ {
24
+ _subscriptions?.Dispose();
25
+ _subscriptions = null;
26
+ _operand.Dispose();
27
+ }
28
+ }
29
+ }
@@ -1,2 +1,2 @@
1
- fileFormatVersion: 2
1
+ fileFormatVersion: 2
2
2
  guid: 453d787470b6b564da4b522d2a6741e1
@@ -1,55 +1,55 @@
1
- using System;
2
- using System.Collections.Generic;
3
-
4
- namespace ObserveThing
5
- {
6
- public class DistinctObservable<T> : IDisposable
7
- {
8
- private ObservableSet<T> _operand;
9
- private Dictionary<T, int> _countByElement = new Dictionary<T, int>();
10
- private IDisposable _subscriptions;
11
-
12
- public DistinctObservable(ICollectionObservable<T> source, ObservableSet<T> operand)
13
- {
14
- _operand = operand;
15
- _subscriptions = source.Subscribe(
16
- onAdd: HandleAdd,
17
- onRemove: HandleRemove,
18
- onError: _operand.OnError,
19
- onDispose: Dispose,
20
- immediate: true
21
- );
22
- }
23
-
24
- private void HandleAdd(T value)
25
- {
26
- bool isNew = !_countByElement.TryGetValue(value, out var count);
27
- _countByElement[value] = count + 1;
28
-
29
- if (isNew)
30
- _operand.Add(value);
31
- }
32
-
33
- private void HandleRemove(T value)
34
- {
35
- var count = _countByElement[value];
36
-
37
- if (count > 1)
38
- {
39
- _countByElement[value] = count - 1;
40
- }
41
- else
42
- {
43
- _countByElement.Remove(value);
44
- _operand.Remove(value);
45
- }
46
- }
47
-
48
- public void Dispose()
49
- {
50
- _subscriptions?.Dispose();
51
- _subscriptions = null;
52
- _operand.Dispose();
53
- }
54
- }
1
+ using System;
2
+ using System.Collections.Generic;
3
+
4
+ namespace ObserveThing
5
+ {
6
+ public class DistinctObservable<T> : IDisposable
7
+ {
8
+ private ObservableSet<T> _operand;
9
+ private Dictionary<T, int> _countByElement = new Dictionary<T, int>();
10
+ private IDisposable _subscriptions;
11
+
12
+ public DistinctObservable(ICollectionObservable<T> source, ObservableSet<T> operand)
13
+ {
14
+ _operand = operand;
15
+ _subscriptions = source.Subscribe(
16
+ onAdd: HandleAdd,
17
+ onRemove: HandleRemove,
18
+ onError: _operand.OnError,
19
+ onDispose: Dispose,
20
+ immediate: true
21
+ );
22
+ }
23
+
24
+ private void HandleAdd(T value)
25
+ {
26
+ bool isNew = !_countByElement.TryGetValue(value, out var count);
27
+ _countByElement[value] = count + 1;
28
+
29
+ if (isNew)
30
+ _operand.Add(value);
31
+ }
32
+
33
+ private void HandleRemove(T value)
34
+ {
35
+ var count = _countByElement[value];
36
+
37
+ if (count > 1)
38
+ {
39
+ _countByElement[value] = count - 1;
40
+ }
41
+ else
42
+ {
43
+ _countByElement.Remove(value);
44
+ _operand.Remove(value);
45
+ }
46
+ }
47
+
48
+ public void Dispose()
49
+ {
50
+ _subscriptions?.Dispose();
51
+ _subscriptions = null;
52
+ _operand.Dispose();
53
+ }
54
+ }
55
55
  }
@@ -1,2 +1,2 @@
1
- fileFormatVersion: 2
1
+ fileFormatVersion: 2
2
2
  guid: 7863e890c2633d14bafff06edee0e7c6
@@ -1,53 +1,53 @@
1
- using System;
2
- using System.Collections.Generic;
3
-
4
- namespace ObserveThing
5
- {
6
- public class FirstObservable<T> : IDisposable
7
- {
8
- private ObservableValue<(bool found, T value)> _operand;
9
- private List<(uint id, T value)> _sortedList = new List<(uint id, T value)>();
10
- private (uint id, T value) _latest;
11
- private IDisposable _subscriptions;
12
-
13
- public FirstObservable(ICollectionObservable<T> source, Func<T, IValueObservable<bool>> validate, ObservableValue<(bool found, T value)> operand)
14
- {
15
- _operand = operand;
16
- _subscriptions = source.ObservableWhere(x => validate(x)).SubscribeWithId(
17
- onAdd: (id, value) =>
18
- {
19
- _sortedList.Add(new(id, value));
20
- _sortedList.Sort((x, y) => x.id.CompareTo(y.id));
21
- SetValueIfNecessary();
22
- },
23
- onRemove: (id, value) =>
24
- {
25
- _sortedList.Remove(new(id, value));
26
- SetValueIfNecessary();
27
- },
28
- onError: operand.OnError,
29
- onDispose: Dispose,
30
- immediate: true
31
- );
32
- }
33
-
34
- private void SetValueIfNecessary()
35
- {
36
- bool found = _sortedList.Count != 0;
37
- var next = _sortedList.Count == 0 ? new(0, default) : _sortedList[0];
38
-
39
- if (_latest.id == next.id && Equals(_latest.value, next.value))
40
- return;
41
-
42
- _latest = next;
43
- _operand.value = new(found, _latest.value);
44
- }
45
-
46
- public void Dispose()
47
- {
48
- _subscriptions?.Dispose();
49
- _subscriptions = null;
50
- _operand.Dispose();
51
- }
52
- }
1
+ using System;
2
+ using System.Collections.Generic;
3
+
4
+ namespace ObserveThing
5
+ {
6
+ public class FirstObservable<T> : IDisposable
7
+ {
8
+ private ObservableValue<(bool found, T value)> _operand;
9
+ private List<(uint id, T value)> _sortedList = new List<(uint id, T value)>();
10
+ private (uint id, T value) _latest;
11
+ private IDisposable _subscriptions;
12
+
13
+ public FirstObservable(ICollectionObservable<T> source, Func<T, IValueObservable<bool>> validate, ObservableValue<(bool found, T value)> operand)
14
+ {
15
+ _operand = operand;
16
+ _subscriptions = source.ObservableWhere(x => validate(x)).SubscribeWithId(
17
+ onAdd: (id, value) =>
18
+ {
19
+ _sortedList.Add(new(id, value));
20
+ _sortedList.Sort((x, y) => x.id.CompareTo(y.id));
21
+ SetValueIfNecessary();
22
+ },
23
+ onRemove: (id, value) =>
24
+ {
25
+ _sortedList.Remove(new(id, value));
26
+ SetValueIfNecessary();
27
+ },
28
+ onError: operand.OnError,
29
+ onDispose: Dispose,
30
+ immediate: true
31
+ );
32
+ }
33
+
34
+ private void SetValueIfNecessary()
35
+ {
36
+ bool found = _sortedList.Count != 0;
37
+ var next = _sortedList.Count == 0 ? new(0, default) : _sortedList[0];
38
+
39
+ if (_latest.id == next.id && Equals(_latest.value, next.value))
40
+ return;
41
+
42
+ _latest = next;
43
+ _operand.value = new(found, _latest.value);
44
+ }
45
+
46
+ public void Dispose()
47
+ {
48
+ _subscriptions?.Dispose();
49
+ _subscriptions = null;
50
+ _operand.Dispose();
51
+ }
52
+ }
53
53
  }
@@ -1,2 +1,2 @@
1
- fileFormatVersion: 2
1
+ fileFormatVersion: 2
2
2
  guid: d856828e138849849bd98637c57b9534