x8l[      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn 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 !"#$%&'()*+,-./0 !"#$%&'()*+,-./0)* !"#$%&'(/-,.+0  !"#$%&'()*+,-./0None>rGiven a dealt and chosen card, update the hand to chosen, and chuck whatever wasn't played onto the discard pile.123456789:;<=>?@AB123456789:;<=>?@AB?456=;@AB8123>9<37:123456789:;<=>?@ABNone4 0If that play and card are forbidden by the rulesIf they try to guess a soldier/If they try to target themselves when forbiddenDA validated card + play combination. Only guarantees that such a thing makes sense according to the rules, rather than the current state of the round.E%A thing that can be done with a card.KRGiven a player, a card, and a choice of play, decide whether it's a valid action.-Return all valid plays for a particular card.L"Return all valid plays for a hand.,If the hand is one that would bust out (see M) then returns an empty list.MIf 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.CDEFGHIJKThe current player%All other active players in the roundThe card they wish to playAll valid plays for that cardLThe current player%All other active players in the roundThe card they were dealtThe card that was in their handAll valid playsM CDEFGHIJKLM CEFGHDMJLKI CDEFGHIJKLMNone P&The given player is the only survivor.Q$These players have the highest card.RThe result of a turn.SvThe player whose turn it was "busted out", they held the Minister and another high card, and thus didn't get to play.T2The player performed an Action resulting in Event.UAA change to the Round that comes as result of a player's actions.V4Nothing happened. What the player did had no effect.WThe player is now protected.X?The first player has been forced to swap hands with the second.Y.The player has been eliminated from the round.Z1The 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._The IDs of all of the players.`%The IDs of all of the active players.aA map of player IDs to players.bEGet the player with the given ID. Nothing if there is no such player.GDraw a card from the top of the Deck. Returns the card and a new Round.$Progress the Round to the next turn.cYThe 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.fPlay 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.gPlay 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.?The currently surviving players in the round, with their cards.hBIf the Round is Over, return the Victory data. Otherwise, Nothing.~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.jAre all the cards in the Round?ANOPQRSTUVWXYZ[\]^_`abcdefghijklm NOPQRSTUVWXYZ[\]^_`abcdefghijklm N]fg\RSTUVWXYZ[cd`ba_ie^OPQhjkml&NOPQRSTUVWXYZ[\]^_`abcdefghijklm None p/Create a new game for the given set of players.qEStart a new round of the game with an already-shuffled deck of cards.rBStart a new round of the game, shuffling the deck cards ourselves.s(Indicate that the specified players won.t#Return the number of rounds played.u-Return the current scores of all the players.vReturn the set of all playerswGet the winners of the game.x,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.nopqrstuvwx nopqrstuvwx onxprqvstuw nopqrstuvwx None yz{|yz{|yz{| yz{| 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.None2 !"#$%&'(,137@ABEFGHINRSTUVWXYZ[\_acdfgopqrtuvwx2oprqvtxuwN\RSTUVWXYZ[fg_acd !"#$%&'(,EFGHI1@AB37 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{| } ~    v -AS] } ~  haver_4HJ9xV5PauG8EwJH4uAzZ5Haverer.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$fConsoleTextTextDeck 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 currentPlayer currentTurn nextPlayerplayTurn playTurn'victory 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.EitherLeftRight survivorsmodifyActivePlayersetActivePlayergetActivePlayer_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