@quenty/observablecollection 12.38.1 → 12.40.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.40.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/observablecollection@12.39.0...@quenty/observablecollection@12.40.0) (2026-07-18)
7
+
8
+ **Note:** Version bump only for package @quenty/observablecollection
9
+
10
+ # [12.39.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/observablecollection@12.38.1...@quenty/observablecollection@12.39.0) (2026-07-14)
11
+
12
+ ### Features
13
+
14
+ - **observablecollection:** convert package to --!strict ([c9e45ee](https://github.com/Quenty/NevermoreEngine/commit/c9e45eeac15ddd736d8848cfbbdca6f525d4cadf))
15
+
6
16
  ## [12.38.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/observablecollection@12.38.0...@quenty/observablecollection@12.38.1) (2026-05-30)
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.38.1",
3
+ "version": "12.40.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.1",
35
+ "@quenty/brio": "14.31.0",
36
36
  "@quenty/ducktype": "5.11.0",
37
- "@quenty/instanceutils": "13.30.1",
37
+ "@quenty/instanceutils": "13.31.0",
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.1",
42
- "@quenty/rx": "13.28.3",
41
+ "@quenty/promise": "10.19.0",
42
+ "@quenty/rx": "13.29.0",
43
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.1",
47
+ "@quenty/valueobject": "13.32.0",
48
48
  "@quentystudios/jest-lua": "3.10.0-quenty.2"
49
49
  },
50
50
  "devDependencies": {
51
- "@quenty/blend": "12.36.1"
51
+ "@quenty/blend": "12.38.0"
52
52
  },
53
53
  "publishConfig": {
54
54
  "access": "public"
55
55
  },
56
- "gitHead": "598b2b62b36bdcbdbbd56f7db10c399831cc6eba"
56
+ "gitHead": "cbbb89635bfdcbf32f26a40422ac736292917cca"
57
57
  }
@@ -1,4 +1,4 @@
1
- --!nonstrict
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(observableList, observeScoreCallback, compare)
30
- local self = setmetatable(BaseObject.new(), FilteredObservableListView)
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:ObserveItemsBrio()
81
- return self._scoredList:ObserveItemsBrio()
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:ObserveIndexByKey(key)
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:GetCount()
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:ObserveCount()
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
- --!nonstrict
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 = node:GetIndex()
588
- self.ItemAdded:Fire(node.data, index, node)
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
- self.ItemRemoved:Fire(node.data, node)
596
+ local anyNode = node :: any
597
+ self.ItemRemoved:Fire(anyNode.data, anyNode)
597
598
  end
598
599
 
599
600
  if not self.Destroy then