Replace copyonwritearray to a custom implementation for concurrent modification exception. A little bit slower but supports iterator operations.
Added FCollectionTest
The original purpose which is to create a copy of linkedlist to iterate to avoid concurrent modification, but we use copyonwritearray design and it is already thread safe and iteration while modification is handled internally.
The main issues is that getAllCards returns a card list that is unique
by name. That menas each card only has a single rarity. In this case,
cards like "Forbidden Orchard" and "Choke" de-deuplicate to a version of
the card with 'S' rarity. This means that when filtering by rarity, the
'S' rarity will be filtered out.
Another similar issue is that when a card exists in multiple sets with
different rarities, you might filter to a set in which the card is 'R',
but the de-duped version in allCards has rarity 'U', so using the cardDB
to check the rarity to filter on doesn't work.
When filtering by a specific set, the solution is to use the rarity of
the card in that set.
When not filtering by a set but filtering by rarity, we have to address
the root cause of the de-duping.
WHen de-duping, I changed the logic to ignore 'S' rarities. This fixes
the rarity filter when not filtering by an edition (although if there
are multiple rarities you still have to kind of guess).
This has the side-effect of making the card image used something more
legible. Before 'Choke' de-duped to the MPS_AHK set which has illegible
text. By ignoring 'S' rarities, it not de-dups to 8ED.
More work could probably be done to improve de-duping, but perfect
correctness would probably involve de-duping only after filtering, which
is likely too slow.