Browse Source

5.4: transitioning between most states.

Frederic G. MARAND 5 years ago
parent
commit
e8eae2d83a
2 changed files with 49 additions and 31 deletions
  1. 9 9
      .idea/workspace.xml
  2. 40 22
      course/index.ts

+ 9 - 9
.idea/workspace.xml

@@ -48,13 +48,13 @@
       <usages-collector id="statistics.file.extensions.edit">
         <counts>
           <entry key="json" value="102" />
-          <entry key="ts" value="6735" />
+          <entry key="ts" value="7592" />
         </counts>
       </usages-collector>
       <usages-collector id="statistics.file.types.edit">
         <counts>
           <entry key="JSON" value="35" />
-          <entry key="TypeScript" value="6735" />
+          <entry key="TypeScript" value="7592" />
           <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="690">
-              <caret line="58" column="2" lean-forward="true" selection-start-line="58" selection-start-column="2" selection-end-line="58" selection-end-column="2" />
+            <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>
           </provider>
         </entry>
@@ -285,7 +285,7 @@
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="25155000" />
+    <option name="totallyTimeSpent" value="26588000" />
   </component>
   <component name="ToolWindowManager">
     <frame x="0" y="23" width="1440" height="877" extended-state="6" />
@@ -313,9 +313,9 @@
       <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.49429658" 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.50570345" 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" 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="690">
-          <caret line="58" column="2" lean-forward="true" selection-start-line="58" selection-start-column="2" selection-end-line="58" selection-end-column="2" />
+        <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>
       </provider>
     </entry>

+ 40 - 22
course/index.ts

@@ -32,28 +32,46 @@ type Game = {
 };
 type Score = Deuce | PointsData | FortyData | Advantage | Game;
 
-const s1: Score = {
-    kind: "points",
-    playerOnePoint: "30",
-    playerTwoPoint: "love",
-};
-
-const s2: Score = {
-    kind: "deuce",
-};
+function scoreWhenDeuce(player: Player): Advantage {
+    return {
+        kind: "advantage",
+        player,
+    }
+}
 
-const s3: Score = {
-    kind: "forty",
-    player: { kind: "playerOne", name: "Serena" },
-    otherPlayerPoint: "love",
-};
+function scoreWhenAdvantage(score: Advantage, player: Player): Game | Deuce {
+    return score.player.kind === player.kind ? {
+        kind: "game",
+        player,
+    } :
+    {
+        kind: "deuce",
+    };
+}
 
-const s4: Score = {
-    kind: "advantage",
-    player: { kind: "playerTwo", name: "Venus" },
-};
+function incrementPoints(point: Point): "15" | "30" | undefined {
+    switch (point) {
+        case "love":
+            return "15";
+        case "15":
+            return "30";
+        case "30":
+            return undefined;
+    }
+}
 
-const s5: Score = {
-    kind: "game",
-    player: { kind: "playerOne", name: "Martina" },
-};
+function scoreWhenForty(score: FortyData, player: Player): Game | Deuce | FortyData {
+    if (score.player.kind === player.kind) {
+        return {
+            kind: "game",
+            player,
+        }
+    }
+    else {
+        // "15" | "30" | undefined is a subset of Point | undefined
+        const newPoints: Point | undefined = incrementPoints(score.otherPlayerPoint);
+        return newPoints === undefined ?
+            { kind: "deuce" } :
+            { ...score, otherPlayerPoint: newPoints };
+    }
+}