[1001] | 1 | from __future__ import annotations
|
---|
| 2 | from typing import TypeVar, Generic, List
|
---|
| 3 | from tudelft.utilities.immutablelist.AbstractImmutableList import AbstractImmutableList
|
---|
| 4 | from tudelft.utilities.immutablelist.ImmutableList import ImmutableList
|
---|
| 5 | from typing import Set
|
---|
| 6 |
|
---|
| 7 | E = TypeVar('E')
|
---|
| 8 |
|
---|
| 9 | class ListWithRemove(Generic[E], AbstractImmutableList[E]):
|
---|
| 10 | '''
|
---|
| 11 | Creates new list with some elements removed from the list. Immutable
|
---|
| 12 | @param list an ImmutableList
|
---|
| 13 | @param removed the removed items. Set to empty set initially.
|
---|
| 14 | '''
|
---|
| 15 |
|
---|
| 16 | def __init__(self, list: ImmutableList[E], removed: Set[int]):
|
---|
| 17 | self._list = list
|
---|
| 18 | self._removedIndices=sorted(frozenset(removed))
|
---|
| 19 |
|
---|
| 20 |
|
---|
| 21 | #Override
|
---|
| 22 | def get(self , index:int) ->E :
|
---|
| 23 | return self._list.get(self._realIndex(index))
|
---|
| 24 |
|
---|
| 25 | def _realIndex(self, index:int) -> int:
|
---|
| 26 | '''
|
---|
| 27 | @param index
|
---|
| 28 | @return the real index of an item in the original list. This can be
|
---|
| 29 | larger than given index because {@link #remvedIndices} are
|
---|
| 30 | invisible. This operation can become expensive if many items have
|
---|
| 31 | been removed
|
---|
| 32 | '''
|
---|
| 33 | realIndex:int = index;
|
---|
| 34 |
|
---|
| 35 | # invariant: realIndex has correct value if only removedIndices up to
|
---|
| 36 | # current iteration were in the list.
|
---|
| 37 | for removed in self._removedIndices:
|
---|
[1002] | 38 | if removed > realIndex:
|
---|
[1001] | 39 | break
|
---|
| 40 | realIndex += 1
|
---|
| 41 |
|
---|
| 42 | return realIndex;
|
---|
| 43 |
|
---|
| 44 |
|
---|
| 45 | #Override
|
---|
| 46 | def size(self) ->int:
|
---|
[1002] | 47 | return self._list.size() - len(self._removedIndices)
|
---|
[1001] | 48 |
|
---|
[1002] | 49 | def remove(self, index:int) -> ListWithRemove[E]:
|
---|
[1001] | 50 | '''
|
---|
| 51 | Remove item at index n
|
---|
| 52 |
|
---|
| 53 | @param index index of the element to return
|
---|
| 54 | @return the element at the specified position in this list before it was
|
---|
| 55 | removed.
|
---|
| 56 | '''
|
---|
| 57 | removed:Set[int] = set(self._removedIndices)
|
---|
[1002] | 58 | removed.add(self._realIndex(index));
|
---|
[1001] | 59 | return ListWithRemove(self._list, removed);
|
---|