Browse Source

5.5: tying everything up.

Frederic G. MARAND 5 years ago
parent
commit
a17992e573
2 changed files with 62 additions and 15 deletions
  1. 11 11
      .idea/workspace.xml
  2. 51 4
      course/index.ts

+ 11 - 11
.idea/workspace.xml

@@ -48,13 +48,13 @@
       <usages-collector id="statistics.file.extensions.edit">
         <counts>
           <entry key="json" value="102" />
-          <entry key="ts" value="7592" />
+          <entry key="ts" value="8462" />
         </counts>
       </usages-collector>
       <usages-collector id="statistics.file.types.edit">
         <counts>
           <entry key="JSON" value="35" />
-          <entry key="TypeScript" value="7592" />
+          <entry key="TypeScript" value="8462" />
           <entry key="tsconfig" value="67" />
         </counts>
       </usages-collector>
@@ -75,8 +75,8 @@
       <file pinned="false" current-in-tab="true">
         <entry file="file://$PROJECT_DIR$/course/index.ts">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="540">
-              <caret line="70" column="67" selection-start-line="70" selection-start-column="67" selection-end-line="70" selection-end-column="67" />
+            <state relative-caret-position="630">
+              <caret line="121" column="25" selection-start-line="121" selection-start-column="25" selection-end-line="121" selection-end-column="25" />
             </state>
           </provider>
         </entry>
@@ -285,14 +285,14 @@
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="26588000" />
+    <option name="totallyTimeSpent" value="27775000" />
   </component>
   <component name="ToolWindowManager">
     <frame x="0" y="23" width="1440" height="877" extended-state="6" />
     <editor active="true" />
     <layout>
       <window_info id="Favorites" order="0" side_tool="true" />
-      <window_info id="Structure" order="1" side_tool="true" visible="true" weight="0.1795422" />
+      <window_info active="true" id="Structure" order="1" side_tool="true" visible="true" weight="0.1795422" />
       <window_info id="npm" order="2" side_tool="true" weight="0.3297568" />
       <window_info anchor="bottom" id="Event Log" order="0" sideWeight="0.5007153" side_tool="true" weight="0.3299363" />
       <window_info anchor="bottom" id="Version Control" order="1" />
@@ -307,15 +307,15 @@
       <window_info anchor="bottom" id="TODO" order="10" />
       <window_info anchor="bottom" id="Docker" order="11" />
       <window_info anchor="bottom" id="Database Changes" order="12" show_stripe_button="false" />
-      <window_info anchor="bottom" id="TypeScript" order="13" weight="0.3299363" />
+      <window_info anchor="bottom" id="TypeScript" order="13" weight="0.18471338" />
       <window_info anchor="right" id="Database" order="0" />
       <window_info anchor="right" id="Mongo Explorer" order="1" />
       <window_info anchor="right" id="Commander" order="2" weight="0.4" />
       <window_info anchor="right" id="Ant Build" order="3" weight="0.25" />
       <window_info anchor="right" content_ui="combo" id="Hierarchy" order="4" sideWeight="0.49582636" weight="0.24964234" />
-      <window_info active="true" anchor="right" content_ui="combo" id="Project" order="5" sideWeight="0.49426752" visible="true" weight="0.25894135" />
+      <window_info anchor="right" content_ui="combo" id="Project" order="5" sideWeight="0.49426752" visible="true" weight="0.25894135" />
       <window_info anchor="right" id="Remote Host" order="6" show_stripe_button="false" />
-      <window_info anchor="right" x="0" y="0" width="310" height="677" id="Documentation" order="7" sideWeight="0.5057325" side_tool="true" weight="0.25894135" />
+      <window_info anchor="right" x="0" y="0" width="310" height="677" id="Documentation" order="7" sideWeight="0.5057325" side_tool="true" visible="true" weight="0.25894135" />
     </layout>
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -580,8 +580,8 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/course/index.ts">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="540">
-          <caret line="70" column="67" selection-start-line="70" selection-start-column="67" selection-end-line="70" selection-end-column="67" />
+        <state relative-caret-position="630">
+          <caret line="121" column="25" selection-start-line="121" selection-start-column="25" selection-end-line="121" selection-end-column="25" />
         </state>
       </provider>
     </entry>

+ 51 - 4
course/index.ts

@@ -19,7 +19,7 @@ type PointsData = {
 type FortyData = {
     kind: "forty";
     player: Player;
-    otherPlayerPoint: Point;
+    otherPlayerPoints: Point;
 };
 type Advantage = {
     kind: "advantage",
@@ -28,7 +28,7 @@ type Advantage = {
 type Game = {
     kind: "game",
     player: Player
-    // otherPlayerPoint: ? Not representable here.
+    // otherPlayerPoints: ? Not representable here.
 };
 type Score = Deuce | PointsData | FortyData | Advantage | Game;
 
@@ -69,9 +69,56 @@ function scoreWhenForty(score: FortyData, player: Player): Game | Deuce | FortyD
     }
     else {
         // "15" | "30" | undefined is a subset of Point | undefined
-        const newPoints: Point | undefined = incrementPoints(score.otherPlayerPoint);
+        const newPoints: Point | undefined = incrementPoints(score.otherPlayerPoints);
         return newPoints === undefined ?
             { kind: "deuce" } :
-            { ...score, otherPlayerPoint: newPoints };
+            { ...score, otherPlayerPoints: newPoints };
+    }
+}
+
+function updatePointsData(score: PointsData, newPoints: Point, player: Player): PointsData {
+    // Discriminated union, with player.kind being the discriminant, player the
+    // union, and the switch the typeGuard.
+    switch (player.kind) {
+        case "playerOne":
+            return { ...score, playerOnePoint: newPoints };
+        case "playerTwo":
+            return { ...score, playerTwoPoint: newPoints };
+    }
+}
+
+function createFortyData(score: PointsData, player: Player): FortyData {
+    let otherPlayerPoint = player.kind === "playerOne"
+        ? score.playerTwoPoint
+        : score.playerOnePoint;
+
+    return {
+        kind: "forty",
+        player,
+        otherPlayerPoints: otherPlayerPoint,
+    }
+}
+
+function scoreWhenPoints(score: PointsData, player: Player): PointsData | FortyData {
+    const newPoints: Point | undefined = player.kind === "playerOne"
+      ? incrementPoints(score.playerOnePoint)
+      : incrementPoints(score.playerTwoPoint);
+    return (newPoints === undefined)
+        ? createFortyData(score, player)
+        : updatePointsData(score, newPoints, player);
+}
+
+function score(score: Score, player: Player): Score {
+    switch (score.kind) {
+        case "points":
+            return scoreWhenPoints(score, player);
+        case "forty":
+            return scoreWhenForty(score, player);
+        case "deuce":
+            return scoreWhenDeuce(player);
+        case "advantage":
+            return scoreWhenAdvantage(score, player);
+        case "game":
+            return score;
     }
 }