Instructor: To determine if a player has won the game, we start in our end model file with this set has won transition that uses the over function to set the has one attribute on our state to either a Boolean or a null value.
In order to make this determination, we'll need to pull the left attribute from our state using this get left transition that uses get state to get the moves a player has left. We also need to pull the current rank value from state as well, which we do with get rank that also uses get state to pull the value.
With these two values, we can create this determine function that takes an integer to a function that takes an integer to either a Boolean or null. We implement determine as a binary curried function that takes the moves left followed by the current rank. Then we check if the rank is greater than zero.
In the event that it is, we also check if the rank ever slips above the moves a player has left, which means they have lost and false is returned. Otherwise, we kick back a null. However, when rank is zero, true is returned and the game is won.
We can now implement this check one state transition to pull the values we need from state by using the crocks converge combinator with lift A2 loaded up with determine, grabbing the values from state using their associated transactions, giving us a new state instance with the resultant holding the outcome.
Finally, we tie it all together with this end game Kleisli arrow from unit, which we implement using compose K with set has one after check one. This composition will set the has one attribute in state based on the result of check one.
To put this little number to good use, we'll export it as the default for this module, and then pop over to our turn module so we can add it as part of the main turn transaction.
Popping to the top of this turn module, we'll pull it in, giving it the name of end game from the end file located in the same model folder. Now we just need to perform our check at the top of every turn by adding it to the head of our turn composition, and we're done.
Let's see what we just implemented by starting up a new game and experiencing what losing feels like by getting a whole mess of them wrong. Although we start off strong by selecting this correct blue square, it just goes downhill from there.
As our move counter increases, we see the bunny super happy with each incorrect answer, until we get to the point that we're presented with this modal, informing us that we have lost the game. Currently, this button does nothing, so we do a manual refresh to run through again and see what being a winner feels like.
This time, we bring our A game and pick each hint correctly, watching that wee little bunny become consumed with anger with each correct answer until the breaking point is reached and we're presented with the modal to confirm the fact that we did anger the bunny.