game board
ID of player applying the map; must be a nonempty string of alphanumeric or underscore characters
mathematical function from cards to cards
(a promise for) the state of the board after the replacement from the perspective of playerId, in the format described in the PS4 handout
Modifies board by replacing every card with f(card), without affecting other state of the game.
This operation must be able to interleave with other operations, so while a map() is in progress, other operations like look() and flip() should not throw an unexpected error or wait for the map() to finish.
The board must remain observably pairwise consistent for players: if two cards on the board match each other at the start of a call to map(), then while that map() is in progress, it must not cause any player to observe a board state in which that pair of cards do not match.
Two interleaving map() operations should not throw an unexpected error, or force each other to wait, or violate pairwise consistency, but the exact way they must interleave is not specified.
fmust be a mathematical function from cards to cards: given some legal cardc, f(c) should be (a promise for) a legal replacement card which is the same every time f(c) is called for that samec.