Browse Source

5.6: Solution review.

Frederic G. MARAND 5 years ago
parent
commit
7fafdd4781
2 changed files with 42 additions and 41 deletions
  1. 9 10
      .idea/workspace.xml
  2. 33 31
      course/index.ts

+ 9 - 10
.idea/workspace.xml

@@ -48,13 +48,13 @@
       <usages-collector id="statistics.file.extensions.edit">
         <counts>
           <entry key="json" value="102" />
-          <entry key="ts" value="8462" />
+          <entry key="ts" value="8684" />
         </counts>
       </usages-collector>
       <usages-collector id="statistics.file.types.edit">
         <counts>
           <entry key="JSON" value="35" />
-          <entry key="TypeScript" value="8462" />
+          <entry key="TypeScript" value="8684" />
           <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="630">
-              <caret line="121" column="25" selection-start-line="121" selection-start-column="25" selection-end-line="121" selection-end-column="25" />
+            <state relative-caret-position="450">
+              <caret line="112" column="67" selection-start-line="112" selection-start-column="67" selection-end-line="112" selection-end-column="67" />
             </state>
           </provider>
         </entry>
@@ -285,14 +285,13 @@
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="27775000" />
+    <option name="totallyTimeSpent" value="28216000" />
   </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 active="true" id="Structure" order="1" side_tool="true" visible="true" weight="0.1795422" />
+      <window_info 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" />
@@ -313,7 +312,7 @@
       <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 anchor="right" content_ui="combo" id="Project" order="5" sideWeight="0.49426752" visible="true" weight="0.25894135" />
+      <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" 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" visible="true" weight="0.25894135" />
     </layout>
@@ -580,8 +579,8 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/course/index.ts">
       <provider selected="true" editor-type-id="text-editor">
-        <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 relative-caret-position="450">
+          <caret line="112" column="67" selection-start-line="112" selection-start-column="67" selection-end-line="112" selection-end-column="67" />
         </state>
       </provider>
     </entry>

+ 33 - 31
course/index.ts

@@ -19,7 +19,7 @@ type PointsData = {
 type FortyData = {
     kind: "forty";
     player: Player;
-    otherPlayerPoints: Point;
+    otherPlayerPoint: Point;
 };
 type Advantage = {
     kind: "advantage",
@@ -28,28 +28,30 @@ type Advantage = {
 type Game = {
     kind: "game",
     player: Player
-    // otherPlayerPoints: ? Not representable here.
+    // otherPlayerPoint: ? Not representable here.
 };
 type Score = Deuce | PointsData | FortyData | Advantage | Game;
 
-function scoreWhenDeuce(player: Player): Advantage {
+// Add the ignored _score parameter to ensure a type check.
+function scoreWhenDeuce(_score: Deuce, player: Player): Advantage {
     return {
         kind: "advantage",
-        player,
-    }
+        player
+    };
 }
 
 function scoreWhenAdvantage(score: Advantage, player: Player): Game | Deuce {
-    return score.player.kind === player.kind ? {
-        kind: "game",
-        player,
-    } :
-    {
-        kind: "deuce",
-    };
+    return score.player.kind === player.kind ?
+        {
+            kind: "game",
+            player: score.player // == player.
+        } :
+        {
+            kind: "deuce"
+        };
 }
 
-function incrementPoints(point: Point): "15" | "30" | undefined {
+function incrementPoint(point: Point): "15" | "30" | undefined {
     switch (point) {
         case "love":
             return "15";
@@ -64,15 +66,14 @@ function scoreWhenForty(score: FortyData, player: Player): Game | Deuce | FortyD
     if (score.player.kind === player.kind) {
         return {
             kind: "game",
-            player,
-        }
-    }
-    else {
+            player: player
+        };
+    } else {
         // "15" | "30" | undefined is a subset of Point | undefined
-        const newPoints: Point | undefined = incrementPoints(score.otherPlayerPoints);
-        return newPoints === undefined ?
+        const newPoints: Point | undefined = incrementPoint(score.otherPlayerPoint);
+        return (newPoints === undefined) ?
             { kind: "deuce" } :
-            { ...score, otherPlayerPoints: newPoints };
+            {...score, otherPlayerPoint: newPoints};
     }
 }
 
@@ -81,9 +82,9 @@ function updatePointsData(score: PointsData, newPoints: Point, player: Player):
     // union, and the switch the typeGuard.
     switch (player.kind) {
         case "playerOne":
-            return { ...score, playerOnePoint: newPoints };
+            return {...score, playerOnePoint: newPoints};
         case "playerTwo":
-            return { ...score, playerTwoPoint: newPoints };
+            return {...score, playerTwoPoint: newPoints};
     }
 }
 
@@ -95,27 +96,28 @@ function createFortyData(score: PointsData, player: Player): FortyData {
     return {
         kind: "forty",
         player,
-        otherPlayerPoints: otherPlayerPoint,
-    }
+        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);
+    const newPoints: Point | undefined = player.kind === "playerOne" ?
+        incrementPoint(score.playerOnePoint) :
+        incrementPoint(score.playerTwoPoint);
+    return newPoints === undefined ?
+        createFortyData(score, player) :
+        updatePointsData(score, newPoints, player);
 }
 
 function score(score: Score, player: Player): Score {
+    // XXX: refactor to avoid the switch and just use a method map.
     switch (score.kind) {
         case "points":
             return scoreWhenPoints(score, player);
         case "forty":
             return scoreWhenForty(score, player);
         case "deuce":
-            return scoreWhenDeuce(player);
+            return scoreWhenDeuce(score, player);
         case "advantage":
             return scoreWhenAdvantage(score, player);
         case "game":