fix predicate interference

This commit is contained in:
Jakob Ketterl 2023-06-02 11:23:33 +02:00
parent 9c4e21316b
commit eec1696e8f
2 changed files with 34 additions and 6 deletions

View file

@ -123,10 +123,10 @@ class ActiveListFilterListener(ActiveListListener):
def onListChange(self, source: "ActiveList", changes: list[ActiveListChange]):
for change in changes:
if isinstance(change, ActiveListIndexAdded):
idx = len([x for x in self.keyMap if x < change.index])
for i in range(idx, len(self.keyMap)):
self.keyMap[i] += 1
if self.filter.predicate(change.newValue):
idx = len([x for x in self.keyMap if x < change.index])
for i in range(idx, len(self.keyMap)):
self.keyMap[i] += 1
self.keyMap.insert(idx, change.index)
self.target.insert(idx, change.newValue)
self.filter.monitor(change.newValue, partial(self._onMonitor, change.newValue))
@ -146,12 +146,12 @@ class ActiveListFilterListener(ActiveListListener):
self.filter.monitor(change.newValue, partial(self._onMonitor, change.newValue))
elif isinstance(change, ActiveListIndexDeleted):
self.filter.unmonitor(change.oldValue)
idx = len([x for x in self.keyMap if x < change.index])
if change.index in self.keyMap:
idx = self.keyMap.index(change.index)
del self.target[idx]
del self.keyMap[idx]
for i in range(idx, len(self.keyMap)):
self.keyMap[i] -= 1
for i in range(idx, len(self.keyMap)):
self.keyMap[i] -= 1
def _onMonitor(self, value):
idx = self.source.index(value)

View file

@ -305,3 +305,31 @@ class ActiveListTest(TestCase):
del list[1]
self.assertEqual(filteredList[2], 5)
def testFilterDeletionWithFilteredIndices(self):
list = ActiveList([1, 2, 3, 4, 5])
filteredList = list.filter(lambda x: x > 3)
del list[0]
self.assertEqual(len(filteredList), 2)
self.assertEqual(filteredList[0], 4)
list[2] = 42
# update should not change length of filtered list
self.assertEqual(len(filteredList), 2)
# update should propagate
self.assertEqual(filteredList[0], 42)
def testFilterAdditionWithFilteredIndices(self):
list = ActiveList([1, 2, 3, 4, 5])
filteredList = list.filter(lambda x: x > 3)
list.insert(0, 0)
self.assertEqual(len(filteredList), 2)
self.assertEqual(filteredList[0], 4)
list[4] = 42
# update should not change length of filtered list
self.assertEqual(len(filteredList), 2)
# update should propagate
self.assertEqual(filteredList[0], 42)