úÎzKnG•      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” None•–—˜™    •–—˜™ None :Assert that the value is Right. Throws error if it's Left. :Assert that the value is Right. Throws error if it's Left.    None š›œ   š›œNone35  None(> !"#$%&'()*+,ž-./012 !"#$%&'()*+,-./012+,"#$%&'()* !1/.0-2  !"#$%&'()*+,ž-./012None@rGiven a dealt and chosen card, update the hand to chosen, and chuck whatever wasn't played onto the discard pile.3Ÿ ¡¢£4¤56789¥¦§:;<=>?@ABCD3456789:;<=>?@ABCDA678?=BCD:345@;>59<3Ÿ£ ¡¢¢4¤56789¥¦§:;<=>?@ABCDNone4 ¨0If that play and card are forbidden by the rules©If they try to guess a soldierª/If they try to target themselves when forbiddenF˜A validated card + play combination. Only guarantees that such a thing makes sense according to the rules, rather than the current state of the round.G%A thing that can be done with a card.MRGiven a player, a card, and a choice of play, decide whether it's a valid action.«-Return all valid plays for a particular card.N"Return all valid plays for a hand.,If the hand is one that would bust out (see O) then returns an empty list.O—If you're holding the Minister, there's a potential to "bust out" -- to have to immediately leave the round because you're holding another high card.E¨©ªF¬GHIJKLM­«The current player%All other active players in the roundThe card they wish to playAll valid plays for that cardNThe current player%All other active players in the roundThe card they were dealtThe card that was in their handAll valid playsO EFGHIJKLMNO EGHIJFOLNMK E¨©ªF¬GHIJKLM­«NONone ( R&The given player is the only survivor.S$These players have the highest card.TThe result of a turn.UvThe player whose turn it was "busted out", they held the Minister and another high card, and thus didn't get to play.V2The player performed an Action resulting in Event.WAA change to the Round that comes as result of a player's actions.X4Nothing happened. What the player did had no effect.YThe player is now protected.Z?The first player has been forced to swap hands with the second.[.The player has been eliminated from the round.\1The player has been forced to discard their hand.]BThe second player has been forced to show their hand to the first._=Make a new round, given a complete Deck and a set of players.`*The number of cards remaining in the deck.aThe IDs of all of the players.b%The IDs of all of the active players.cA map of player IDs to players.dEGet the player with the given ID. Nothing if there is no such player.eFGet the burn card for the Round. Only possible when the Round is over. Since 0.1.1®GDraw a card from the top of the Deck. Returns the card and a new Round.¯$Progress the Round to the next turn.fYThe ID of the current player. If the Round is over or not started, this will be Nothing.°•Translate a player action into a change to make to the round. Will return errors if the action is for or against an inactive or nonexistent player.NIf the target player is protected, will return the identity result, NoChange.±Apply a change to the Round.iPlay a turn in a Round.)This is the main function in this module.ÒA turn has two steps. First, the player draws a card. If their hand "busts out" (due to holding the Minister and another high card), then they are eliminated and play proceeds to the next player. This is the ²Y return value, which returns the new Round and a Result indicating the player bust out.=Second, the player plays one of these two cards. This is the ³œ return value, a function that takes the players chosen card and play, and returns either a BadAction or a new Round together with the Result of the play.jPlay a turn in a RoundÕSimilar to playTurn, except that instead of splitting the turn into two phases, there is a single, optional play. If the hand is a busting hand, then the play must be Nothing; if not, the play must be specified.kBIf the Round is Over, return the Victory data. Otherwise, Nothing.l?The currently surviving players in the round, with their cards.´~Update the given player in Round. If the update function returns Nothing, then that is taken to mean the player was inactive.µyReplace the given player in the Round. If the new player is inactive, then the player is dropped from the cycle of play.¶†Get the given player, asserting they must be active. Will return a Left if no player is found or if the requested player is inactive.nAre all the cards in the Round?BP·¸¹º»¼½¾¿ÀÁQRSÂTUVWXYZ[\]^ÃÄÅÆÇÈÉÊËÌÍÎ_`abcde®¯fgh°±ijklm´µ¶Ïnopq"PQRSTUVWXYZ[\]^_`abcdefghijklmnopq"P_ij^TUVWXYZ[\]fgbedcamh`QRSlknoqp'P·¸¹º»¼½¾¿ÀÁQRSÂTUVWXYZ[\]^ÃÄÅÆÇÈÉÊËÌÍÎ_`abcde®¯fgh°±ijklm´µ¶Ïnopq None t/Create a new game for the given set of players.uEStart a new round of the game with an already-shuffled deck of cards.vBStart a new round of the game, shuffling the deck cards ourselves.w(Indicate that the specified players won.x#Return the number of rounds played.y-Return the current scores of all the players.zReturn the set of all players{Get the winners of the game.|,Get the final scores at the end of the game.ÐYPerform an operation on the score counter. If this ends the game, return a Left Outcome.rÑÒsÓÔÕÖרtuvwxyz{|Ð rstuvwxyz{| sr|tvuzwxy{ rÑÒsÓÔÕÖרtuvwxyz{|Ð None }~€ÙÚÛÜÝÞß}~€}~€ }~€ÙÚÛÜÝÞß None7‚ƒ„…†‡ˆ‰Šàáâã ‚ƒ„…†‡ˆ‰Š ‚ƒ„…†‡ˆ‰Š‚ƒ„…†‡ˆ‰Šàáâã None‹ŒŽ‹ŒŽ‹ŒŽ‹ŒŽ None35 For a Round and a known-good Card and Play, play the cards and return the round and event. If the hand busts out, Card and Play are ignored.äšGiven a Round, generate a Round that's randomly had a move applied, i.e. a possible next Round. If there are no valid moves, then return the same Round.å@Generate a sequence of N rounds, starting from an initial round.‘OGenerate a random number of consecutive rounds, starting from an initial round.’AGenerate a random round that might come up in the course of play.æIGenerate a random, non-terminating round and a valid play for that round.“;Generate an event that might come up in the course of play.”2Take a list and generate a shuffled version of it.çKind of like iterate, but for a monadic function, such that the result of calling once is used as the argument for calling next.èäå‘’æ“”çéêë‘’“”“’‘”èäå‘’æ“”çéêëNone5 !"#$%&'()*.359BCDGHIJKPTUVWXYZ[\]^acfgijstuvxyz{|5stvuzx|y{P^TUVWXYZ[\]ijacfg"#$%&'()* !.GHIJK3BCD59ì !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž  ‘ ’ “ ” • – — ˜ ™ š › œ ž y Ÿ   ¡ ¢£¤¥¦§¨.©ª«¬­®C¯°±²³´µU¶·¸¹º»¼½»¼¾¿ÀÁ_ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕ‰Öר Ù  Ú ‚ Û Ä Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñòhaver_4SFDLcRo4pZ69Z8SubDZUeHaverer.Internal.ErrorHaverer.Internal.RingHaverer.Internal.CounterHaverer.CLI.Prompt Haverer.DeckHaverer.PlayerHaverer.Action Haverer.Round Haverer.GameHaverer.CLI.CommandLineHaverer.EngineHaverer.ValidMovesHaverer.TestingHavererbasic_5heUEPmKHgdGfRkhybJU7j CorePreludeterrorRingmakeRingtoListadvanceadvance1dropItem dropItem1ringSize currentItemnextItem assertRight assertRight'Counter incrementMany increment initializetopValuetop ConsoleTexttoText underlinepromptrepeatedlyPrompt chooseItem chooseItem'$fConsoleTextInt$fConsoleTextTextFullDeckDeckDeckSize IncompleteCompleteCardSoldierClownKnight PriestessWizardGeneralMinisterPrinceallCards baseCards shuffleDecknewDeckmakeDeckpopdealPlayer PlayerSet toPlayersErrorInvalidNumPlayersDuplicatePlayers toPlayerSet makePlayerprotect unprotect eliminate swapHandsdiscardAndDrawplayCardbust getDiscardsgetHand isProtectedBadPlayActionPlayNoEffectAttackGuess viewAction getTarget playToAction getValidPlays bustingHandRoundVictory SoleSurvivor HighestCardResult BustedOutPlayedEventNoChange Protected SwappedHands Eliminated ForcedDiscard ForcedReveal BadAction makeRoundremainingCards getPlayersgetActivePlayers getPlayerMap getPlayer getBurnCard currentPlayer currentTurn nextPlayerplayTurn playTurn'victory survivors getWinnersprop_allCardsPresentprop_burnCardsSameprop_ringIsActivePlayersprop_multipleActivePlayersOutcomeGamemakeGame newRound'newRound playersWon roundsPlayedscoresplayerswinners finalScores formatScorespickNumPlayerspickCardToPlaypickPlay MonadEnginebadPlay choosePlay gameStartedgameOver roundStarted roundOver handStartedhandOverplayGame getValidMovesprotectedPlayersmovesThatTargetPlayerattacksOnProtectedPlayersPlayerId randomRounds randomRound inRoundEventshuffled_items_current_length advanceBy _uncounter withValuebaseDeckActive_hand _protected_discardInactivediscardhand protectedBadActionForCardBadGuess SelfTargetgetValidPlaysForCard _validatePlaydrawCardnextTurn actionToEvent applyEventbase Data.EitherLeftRightmodifyActivePlayersetActivePlayergetActivePlayer_stack _playOrder_players _roundState_burn RoundState NotStartedTurnPlayingOverActionM NoSuchPlayerInactivePlayer InvalidPlay WrongCardPlayWhenBustedNoPlaySpecified RoundOverburn playOrder roundStatestackgetActivePlayerHand onCounter _unoutcome _winningScore _playerSet _roundsPlayed PlayerScores pickTarget pickAttack pickGuess$fConsoleTextVictory$fConsoleTextResult$fConsoleTextRound$fConsoleTextCard playGame' playRoundplayHandgetPlayrandomNextMove manyMoves roundAndPlay iterateM'playRandomTurn$fArbitraryRound$fArbitraryPlayerSet$fArbitraryDeck