@quenty/observablecollection 12.38.0 → 12.39.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.
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [12.39.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/observablecollection@12.38.1...@quenty/observablecollection@12.39.0) (2026-07-14)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- **observablecollection:** convert package to --!strict ([c9e45ee](https://github.com/Quenty/NevermoreEngine/commit/c9e45eeac15ddd736d8848cfbbdca6f525d4cadf))
|
|
11
|
+
|
|
12
|
+
## [12.38.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/observablecollection@12.38.0...@quenty/observablecollection@12.38.1) (2026-05-30)
|
|
13
|
+
|
|
14
|
+
**Note:** Version bump only for package @quenty/observablecollection
|
|
15
|
+
|
|
6
16
|
# [12.38.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/observablecollection@12.37.0...@quenty/observablecollection@12.38.0) (2026-05-29)
|
|
7
17
|
|
|
8
18
|
**Note:** Version bump only for package @quenty/observablecollection
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/observablecollection",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.39.0",
|
|
4
4
|
"description": "A set of observable collections, such as sets, maps, sorted lists, and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -32,26 +32,26 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@quenty/baseobject": "10.13.0",
|
|
34
34
|
"@quenty/binarysearch": "2.4.0",
|
|
35
|
-
"@quenty/brio": "14.30.
|
|
35
|
+
"@quenty/brio": "14.30.1",
|
|
36
36
|
"@quenty/ducktype": "5.11.0",
|
|
37
|
-
"@quenty/instanceutils": "13.30.
|
|
37
|
+
"@quenty/instanceutils": "13.30.1",
|
|
38
38
|
"@quenty/loader": "10.11.0",
|
|
39
39
|
"@quenty/maid": "3.9.0",
|
|
40
40
|
"@quenty/nevermore-test-runner": "1.4.0",
|
|
41
|
-
"@quenty/promise": "10.18.
|
|
42
|
-
"@quenty/rx": "13.28.
|
|
43
|
-
"@quenty/signal": "7.13.
|
|
41
|
+
"@quenty/promise": "10.18.1",
|
|
42
|
+
"@quenty/rx": "13.28.3",
|
|
43
|
+
"@quenty/signal": "7.13.1",
|
|
44
44
|
"@quenty/steputils": "3.6.3",
|
|
45
45
|
"@quenty/symbol": "3.5.2",
|
|
46
46
|
"@quenty/table": "3.9.2",
|
|
47
|
-
"@quenty/valueobject": "13.31.
|
|
47
|
+
"@quenty/valueobject": "13.31.1",
|
|
48
48
|
"@quentystudios/jest-lua": "3.10.0-quenty.2"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@quenty/blend": "12.
|
|
51
|
+
"@quenty/blend": "12.37.0"
|
|
52
52
|
},
|
|
53
53
|
"publishConfig": {
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "13f0162f4971a77378e55e9b7236aea94f0dd3a8"
|
|
57
57
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
--!
|
|
1
|
+
--!strict
|
|
2
2
|
--[=[
|
|
3
3
|
@class FilteredObservableListView
|
|
4
4
|
]=]
|
|
@@ -6,16 +6,36 @@
|
|
|
6
6
|
local require = require(script.Parent.loader).load(script)
|
|
7
7
|
|
|
8
8
|
local BaseObject = require("BaseObject")
|
|
9
|
+
local Brio = require("Brio")
|
|
9
10
|
local Observable = require("Observable")
|
|
10
11
|
local ObservableSortedList = require("ObservableSortedList")
|
|
11
12
|
local Rx = require("Rx")
|
|
13
|
+
local SortedNode = require("SortedNode")
|
|
14
|
+
local Symbol = require("Symbol")
|
|
12
15
|
|
|
13
16
|
local FilteredObservableListView = setmetatable({}, BaseObject)
|
|
14
17
|
FilteredObservableListView.ClassName = "FilteredObservableListView"
|
|
15
18
|
FilteredObservableListView.__index = FilteredObservableListView
|
|
16
19
|
|
|
20
|
+
export type ObservableListLike<T> = {
|
|
21
|
+
ObserveItemsBrio: (self: any) -> Observable.Observable<Brio.Brio<T>>,
|
|
22
|
+
ObserveIndexByKey: (self: any, key: Symbol.Symbol) -> Observable.Observable<number?>,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type FilteredObservableListView<T> =
|
|
26
|
+
typeof(setmetatable(
|
|
27
|
+
{} :: {
|
|
28
|
+
_compare: (any, any) -> number,
|
|
29
|
+
_baseList: ObservableListLike<T>,
|
|
30
|
+
_observeScoreCallback: (T) -> Observable.Observable<any>,
|
|
31
|
+
_scoredList: ObservableSortedList.ObservableSortedList<T>,
|
|
32
|
+
},
|
|
33
|
+
{} :: typeof({ __index = FilteredObservableListView })
|
|
34
|
+
))
|
|
35
|
+
& BaseObject.BaseObject
|
|
36
|
+
|
|
17
37
|
-- Higher numbers last
|
|
18
|
-
local function defaultCompare(a, b)
|
|
38
|
+
local function defaultCompare(a: any, b: any): number
|
|
19
39
|
-- equivalent of `return a - b` except it supports comparison of strings and stuff
|
|
20
40
|
if b > a then
|
|
21
41
|
return -1
|
|
@@ -26,25 +46,29 @@ local function defaultCompare(a, b)
|
|
|
26
46
|
end
|
|
27
47
|
end
|
|
28
48
|
|
|
29
|
-
function FilteredObservableListView.new(
|
|
30
|
-
|
|
49
|
+
function FilteredObservableListView.new<T>(
|
|
50
|
+
observableList: ObservableListLike<T>,
|
|
51
|
+
observeScoreCallback: (T) -> Observable.Observable<any>,
|
|
52
|
+
compare: ((any, any) -> number)?
|
|
53
|
+
): FilteredObservableListView<T>
|
|
54
|
+
local self: FilteredObservableListView<T> = setmetatable(BaseObject.new() :: any, FilteredObservableListView)
|
|
31
55
|
|
|
32
56
|
self._compare = compare or defaultCompare
|
|
33
57
|
self._baseList = assert(observableList, "No observableList")
|
|
34
58
|
self._observeScoreCallback = assert(observeScoreCallback, "No observeScoreCallback")
|
|
35
59
|
|
|
36
|
-
self._scoredList = self._maid:Add(ObservableSortedList.new(false, function(a, b)
|
|
60
|
+
self._scoredList = self._maid:Add(ObservableSortedList.new(false, function(a: any, b: any): number
|
|
37
61
|
-- Preserve index when scoring does not
|
|
38
62
|
if a.score == b.score then
|
|
39
63
|
return a.index - b.index
|
|
40
64
|
else
|
|
41
65
|
return self._compare(a.score, b.score)
|
|
42
66
|
end
|
|
43
|
-
end))
|
|
67
|
+
end) :: ObservableSortedList.ObservableSortedList<T>)
|
|
44
68
|
|
|
45
69
|
-- Shockingly this is somewhat performant because the sorted list defers all events
|
|
46
70
|
-- to process the list reordering.
|
|
47
|
-
self._maid:GiveTask(self._baseList:ObserveItemsBrio():Subscribe(function(brio)
|
|
71
|
+
self._maid:GiveTask((self._baseList:ObserveItemsBrio() :: any):Subscribe(function(brio: any)
|
|
48
72
|
if brio:IsDead() then
|
|
49
73
|
return
|
|
50
74
|
end
|
|
@@ -56,11 +80,11 @@ function FilteredObservableListView.new(observableList, observeScoreCallback, co
|
|
|
56
80
|
|
|
57
81
|
maid._add = self._scoredList:Add(
|
|
58
82
|
entry,
|
|
59
|
-
Rx.combineLatest({
|
|
83
|
+
(Rx.combineLatest({
|
|
60
84
|
score = observeScore,
|
|
61
85
|
index = self._baseList:ObserveIndexByKey(key),
|
|
62
|
-
}):Pipe({
|
|
63
|
-
Rx.map(function(state)
|
|
86
|
+
}) :: any):Pipe({
|
|
87
|
+
Rx.map(function(state): any
|
|
64
88
|
if state.score == nil then
|
|
65
89
|
return nil
|
|
66
90
|
end
|
|
@@ -77,8 +101,10 @@ end
|
|
|
77
101
|
Observes all items in the list
|
|
78
102
|
@return Observable<Brio<T>>
|
|
79
103
|
]=]
|
|
80
|
-
function FilteredObservableListView
|
|
81
|
-
|
|
104
|
+
function FilteredObservableListView.ObserveItemsBrio<T>(
|
|
105
|
+
self: FilteredObservableListView<T>
|
|
106
|
+
): Observable.Observable<Brio.Brio<T>>
|
|
107
|
+
return (self._scoredList:ObserveItemsBrio() :: any) :: Observable.Observable<Brio.Brio<T>>
|
|
82
108
|
end
|
|
83
109
|
|
|
84
110
|
--[=[
|
|
@@ -88,7 +114,10 @@ end
|
|
|
88
114
|
@param key Symbol
|
|
89
115
|
@return Observable<number>
|
|
90
116
|
]=]
|
|
91
|
-
function FilteredObservableListView
|
|
117
|
+
function FilteredObservableListView.ObserveIndexByKey<T>(
|
|
118
|
+
self: FilteredObservableListView<T>,
|
|
119
|
+
key: SortedNode.SortedNode<T>
|
|
120
|
+
): Observable.Observable<number>
|
|
92
121
|
return self._scoredList:ObserveIndexByKey(key)
|
|
93
122
|
end
|
|
94
123
|
|
|
@@ -96,7 +125,7 @@ end
|
|
|
96
125
|
Gets the count of items in the list
|
|
97
126
|
@return number
|
|
98
127
|
]=]
|
|
99
|
-
function FilteredObservableListView
|
|
128
|
+
function FilteredObservableListView.GetCount<T>(self: FilteredObservableListView<T>): number
|
|
100
129
|
return self._scoredList:GetCount()
|
|
101
130
|
end
|
|
102
131
|
|
|
@@ -106,7 +135,7 @@ FilteredObservableListView.__len = FilteredObservableListView.GetCount
|
|
|
106
135
|
Observes the count of the list
|
|
107
136
|
@return Observable<number>
|
|
108
137
|
]=]
|
|
109
|
-
function FilteredObservableListView
|
|
138
|
+
function FilteredObservableListView.ObserveCount<T>(self: FilteredObservableListView<T>): Observable.Observable<number>
|
|
110
139
|
return self._scoredList:ObserveCount()
|
|
111
140
|
end
|
|
112
141
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
--!
|
|
2
|
-
--strict
|
|
1
|
+
--!strict
|
|
3
2
|
--[=[
|
|
4
3
|
A list that can be observed for blend and other components and maintains sorting order.
|
|
5
4
|
|
|
@@ -97,7 +96,7 @@ function ObservableSortedList.new<T>(isReversed: boolean?, compare: CompareFunct
|
|
|
97
96
|
@prop ItemAdded Signal<T, number, Symbol>
|
|
98
97
|
@within ObservableSortedList
|
|
99
98
|
]=]
|
|
100
|
-
self.ItemAdded = self._maid:Add(Signal.new())
|
|
99
|
+
self.ItemAdded = self._maid:Add(Signal.new()) :: any
|
|
101
100
|
|
|
102
101
|
--[=[
|
|
103
102
|
Fires when an item is removed.
|
|
@@ -106,7 +105,7 @@ function ObservableSortedList.new<T>(isReversed: boolean?, compare: CompareFunct
|
|
|
106
105
|
@prop ItemRemoved Signal<T, Symbol>
|
|
107
106
|
@within ObservableSortedList
|
|
108
107
|
]=]
|
|
109
|
-
self.ItemRemoved = self._maid:Add(Signal.new())
|
|
108
|
+
self.ItemRemoved = self._maid:Add(Signal.new()) :: any
|
|
110
109
|
|
|
111
110
|
--[=[
|
|
112
111
|
Fires when the order could have changed
|
|
@@ -160,7 +159,7 @@ function ObservableSortedList.__iter<T>(self: ObservableSortedList<T>): SortFunc
|
|
|
160
159
|
if self._root then
|
|
161
160
|
return self._root:IterateData()
|
|
162
161
|
else
|
|
163
|
-
return SortFunctionUtils.emptyIterator
|
|
162
|
+
return SortFunctionUtils.emptyIterator :: any
|
|
164
163
|
end
|
|
165
164
|
end
|
|
166
165
|
|
|
@@ -189,7 +188,7 @@ function ObservableSortedList._iterateNodes<T>(
|
|
|
189
188
|
if self._root then
|
|
190
189
|
return self._root:IterateNodes()
|
|
191
190
|
else
|
|
192
|
-
return SortFunctionUtils.emptyIterator
|
|
191
|
+
return SortFunctionUtils.emptyIterator :: any
|
|
193
192
|
end
|
|
194
193
|
end
|
|
195
194
|
|
|
@@ -201,7 +200,7 @@ function ObservableSortedList._iterateNodesRange<T>(
|
|
|
201
200
|
if self._root then
|
|
202
201
|
return self._root:IterateNodesRange(start, finish)
|
|
203
202
|
else
|
|
204
|
-
return SortFunctionUtils.emptyIterator
|
|
203
|
+
return SortFunctionUtils.emptyIterator :: any
|
|
205
204
|
end
|
|
206
205
|
end
|
|
207
206
|
|
|
@@ -358,7 +357,7 @@ function ObservableSortedList.ObserveAtIndex<T>(
|
|
|
358
357
|
if node then
|
|
359
358
|
sub:Fire(node.data, node)
|
|
360
359
|
else
|
|
361
|
-
sub:Fire(nil, nil)
|
|
360
|
+
sub:Fire(nil :: any, nil :: any)
|
|
362
361
|
end
|
|
363
362
|
end) :: any
|
|
364
363
|
end
|
|
@@ -503,7 +502,7 @@ function ObservableSortedList._assignSortValue<T>(
|
|
|
503
502
|
end
|
|
504
503
|
|
|
505
504
|
if self._compare ~= nil then
|
|
506
|
-
value = SortedNodeValue.new(value, self._compare) :: any
|
|
505
|
+
value = SortedNodeValue.new(value, self._compare :: any) :: any
|
|
507
506
|
end
|
|
508
507
|
|
|
509
508
|
-- our value changing didn't change anything
|
|
@@ -583,9 +582,10 @@ function ObservableSortedList._fireEvents<T>(self: ObservableSortedList<T>)
|
|
|
583
582
|
|
|
584
583
|
-- TODO: Prevent Rx.of(itemAdded) stuff in our UI
|
|
585
584
|
for node in nodesAdded do
|
|
585
|
+
local anyNode = node :: any
|
|
586
586
|
-- TODO: Prevent query slow here...?
|
|
587
|
-
local index =
|
|
588
|
-
self.ItemAdded:Fire(
|
|
587
|
+
local index = anyNode:GetIndex()
|
|
588
|
+
self.ItemAdded:Fire(anyNode.data, index, anyNode)
|
|
589
589
|
end
|
|
590
590
|
|
|
591
591
|
if not self.Destroy then
|
|
@@ -593,7 +593,8 @@ function ObservableSortedList._fireEvents<T>(self: ObservableSortedList<T>)
|
|
|
593
593
|
end
|
|
594
594
|
|
|
595
595
|
for node in nodesRemoved do
|
|
596
|
-
|
|
596
|
+
local anyNode = node :: any
|
|
597
|
+
self.ItemRemoved:Fire(anyNode.data, anyNode)
|
|
597
598
|
end
|
|
598
599
|
|
|
599
600
|
if not self.Destroy then
|