t      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r 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-./#!Rotate the order of the PlayerSetmThe player who was first is now last, whoever was second is now third, whoever was third is now second, etc. Since 0.3$$Randomize the order of the PlayerSet Since 0.3  !"#$ !"#$  !"$# !"#$None(>%&'()*+,-./0123456789:%&'()*+,-./0123456789:34*+,-./012'()9&%7685: %&'()*+,-./0123456789:NoneBrGiven a dealt and chosen card, update the hand to chosen, and chuck whatever wasn't played onto the discard pile.;<=>?@ABCDEF ;<=>?@ABCDEF CA?DEF<;B=@>;<=>?@ABCDEFNone4 0If that play and card are forbidden by the rulesIf they try to guess a soldier/If they try to target themselves when forbiddenHA validated card + play combination. Only guarantees that such a thing makes sense according to the rules, rather than the current state of the round.I%A thing that can be done with a card.ORGiven a player, a card, and a choice of play, decide whether it's a valid action.-Return all valid plays for a particular card.P"Return all valid plays for a hand.,If the hand is one that would bust out (see Q) then returns an empty list.QIf 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.GHIJKLMNOThe current player%All other active players in the roundThe card they wish to playAll valid plays for that cardPThe current player%All other active players in the roundThe card they were dealtThe card that was in their handAll valid playsQ GHIJKLMNOPQ GIJKLHQNPOM GHIJKLMNOPQ None ( T&The given player is the only survivor.U$These players have the highest card.VThe result of a turn.WvThe player whose turn it was "busted out", they held the Minister and another high card, and thus didn't get to play.X2The player performed an Action resulting in Event.YAA change to the Round that comes as result of a player's actions.Z4Nothing happened. What the player did had no effect.[The player is now protected.\?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.a=Make a new round, given a complete Deck and a set of players.b*The number of cards remaining in the deck.cThe IDs of all of the players.d%The IDs of all of the active players.eA map of player IDs to players.fEGet the player with the given ID. Nothing if there is no such player.gFGet the burn card for the Round. Only possible when the Round is over. Since 0.1.1GDraw a card from the top of the Deck. Returns the card and a new Round.$Progress the Round to the next turn.hYThe 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.kPlay 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.lPlay a turn in a RoundSimilar 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.mBIf the Round is Over, return the Victory data. Otherwise, Nothing.n?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.pAre all the cards in the Round?BRSTUVWXYZ[\]^_`abcdefghijklmnopqrs"RSTUVWXYZ[\]^_`abcdefghijklmnopqrs"Rakl`VWXYZ[\]^_hidgfecojbSTUnmpqsr'RSTUVWXYZ[\]^_`abcdefghijklmnopqrs None v/Create a new game for the given set of players.wEStart a new round of the game with an already-shuffled deck of cards.xBStart a new round of the game, shuffling the deck cards ourselves.y(Indicate that the specified players won.xSince 0.3, will also rotate the order of play, so the person to the left of the previous first person is now the first.z#Return the number of rounds played.{-Return the current scores of all the players.|Return 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.tuvwxyz{|}~ tuvwxyz{|}~ ut~vxw|yz{} tuvwxyz{|}~ None   None7  NoneNone35 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.None9 !"%&'()*+,-./0126;DEFIJKLMRVWXYZ[\]^_`cehikluvwxz{|}~:uvxw|z~{}R`VWXYZ[\]^_klcehi*+,-./012&'()%6IJKLM;DEF !" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~     |.7X  b                 haver_0t3iZcjqpgqBb0FXYkz4joHaverer.Internal.ErrorHaverer.Internal.RingHaverer.Internal.CounterHaverer.CLI.PromptHaverer.PlayerSet 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$fConsoleTextText PlayerSet toPlayersPlayerSetErrorInvalidNumPlayersDuplicatePlayers toPlayerSetrotate randomizeFullDeckDeckDeckSize IncompleteCompleteCardSoldierClownKnight PriestessWizardGeneralMinisterPrinceallCards baseCards shuffleDecknewDeckmakeDeckpopdealPlayer 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