Browse Source

5.2: the first types in the Tennis kata.

Frederic G. MARAND 5 years ago
parent
commit
3ed6c137b7

+ 1 - 0
.idea/Pluralsight-GetTheMostFromTypescript.iml

@@ -6,6 +6,7 @@
       <excludeFolder url="file://$MODULE_DIR$/03" />
       <excludeFolder url="file://$MODULE_DIR$/04" />
       <excludeFolder url="file://$MODULE_DIR$/05" />
+      <excludeFolder url="file://$MODULE_DIR$/course/dist" />
       <excludeFolder url="file://$MODULE_DIR$/js" />
       <excludeFolder url="file://$MODULE_DIR$/resources" />
     </content>

+ 0 - 12
.idea/runConfigurations/NPM_Start.xml

@@ -1,12 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="NPM Start" type="js.build_tools.npm" factoryName="npm">
-    <package-json value="$PROJECT_DIR$/course/package.json" />
-    <command value="run" />
-    <scripts>
-      <script value="start" />
-    </scripts>
-    <node-interpreter value="project" />
-    <envs />
-    <method v="2" />
-  </configuration>
-</component>

+ 62 - 64
.idea/workspace.xml

@@ -2,40 +2,7 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="c6f02f4e-af06-43d1-8bc0-507af01d0573" name="Default Changelist" comment="">
-      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/.angular-cli.json" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/course/package.json" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app.d.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/app-routing.module.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/app.module.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/base-report.component.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/create-report-item.component.css" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/create-report-item.component.html" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/create-report-item.component.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/create-report.component.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/edit-report.component.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/report.component.css" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/report.component.html" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/reports.component.css" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/reports.component.html" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/reports.component.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/root.component.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/services/messenger.service.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/services/reportData.service.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/services/reportItem.service.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/services/window.service.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/app/types.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/assets/.gitkeep" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/environments/environment.prod.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/environments/environment.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/favicon.ico" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/index.html" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/main.ts" beforeDir="false" afterPath="$PROJECT_DIR$/course/index.ts" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/polyfills.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/styles.css" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/tsconfig.app.json" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/src/typings.d.ts" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/course/tsconfig.json" beforeDir="false" afterPath="$PROJECT_DIR$/course/tsconfig.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/course/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/course/index.ts" afterDir="false" />
     </list>
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
@@ -60,8 +27,9 @@
           <entry key="gitignore" value="3" />
           <entry key="groovy" value="1" />
           <entry key="html" value="1" />
-          <entry key="json" value="21" />
-          <entry key="ts" value="74" />
+          <entry key="js" value="1" />
+          <entry key="json" value="25" />
+          <entry key="ts" value="75" />
           <entry key="txt" value="1" />
         </counts>
       </usages-collector>
@@ -69,23 +37,24 @@
         <counts>
           <entry key="CSS" value="1" />
           <entry key="HTML" value="1" />
-          <entry key="JSON" value="4" />
+          <entry key="JSON" value="6" />
+          <entry key="JavaScript" value="1" />
           <entry key="PLAIN_TEXT" value="3" />
           <entry key="Scratch" value="3" />
-          <entry key="TypeScript" value="74" />
-          <entry key="tsconfig" value="17" />
+          <entry key="TypeScript" value="75" />
+          <entry key="tsconfig" value="19" />
         </counts>
       </usages-collector>
       <usages-collector id="statistics.file.extensions.edit">
         <counts>
           <entry key="json" value="102" />
-          <entry key="ts" value="5682" />
+          <entry key="ts" value="6022" />
         </counts>
       </usages-collector>
       <usages-collector id="statistics.file.types.edit">
         <counts>
           <entry key="JSON" value="35" />
-          <entry key="TypeScript" value="5682" />
+          <entry key="TypeScript" value="6022" />
           <entry key="tsconfig" value="67" />
         </counts>
       </usages-collector>
@@ -102,7 +71,17 @@
     </session>
   </component>
   <component name="FileEditorManager">
-    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300" />
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <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="270">
+              <caret line="18" column="31" selection-start-line="18" selection-start-column="31" selection-end-line="18" selection-end-column="31" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
   </component>
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
@@ -155,11 +134,14 @@
         <option value="$PROJECT_DIR$/.gitignore" />
         <option value="$PROJECT_DIR$/course/src/app/services/reportData.service.ts" />
         <option value="$PROJECT_DIR$/course/src/app/services/reportItem.service.ts" />
+        <option value="$PROJECT_DIR$/course/index.ts" />
       </list>
     </option>
   </component>
   <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER">
+    <package-json value="$PROJECT_DIR$/course/package.json" />
+  </component>
   <component name="JsGulpfileManager">
     <detection-done>true</detection-done>
     <sorting>DEFINITION_ORDER</sorting>
@@ -212,12 +194,6 @@
               <item name="Pluralsight-GetTheMostFromTypescript" type="462c0819:PsiDirectoryNode" />
               <item name="05" type="462c0819:PsiDirectoryNode" />
             </path>
-            <path>
-              <item name="Pluralsight-GetTheMostFromTypescript" type="b2602c69:ProjectViewProjectNode" />
-              <item name="Pluralsight-GetTheMostFromTypescript" type="462c0819:PsiDirectoryNode" />
-              <item name="05" type="462c0819:PsiDirectoryNode" />
-              <item name="demos" type="462c0819:PsiDirectoryNode" />
-            </path>
             <path>
               <item name="Pluralsight-GetTheMostFromTypescript" type="b2602c69:ProjectViewProjectNode" />
               <item name="Pluralsight-GetTheMostFromTypescript" type="462c0819:PsiDirectoryNode" />
@@ -247,7 +223,7 @@
     <property name="nodejs_interpreter_path.stuck_in_default_project" value="/usr/local/bin/node" />
     <property name="nodejs_npm_path_reset_for_default_project" value="true" />
     <property name="nodejs_package_manager_path" value="yarn" />
-    <property name="settings.editor.selected.configurable" value="preferences.sourceCode" />
+    <property name="settings.editor.selected.configurable" value="settings.typescriptcompiler" />
     <property name="ts.external.directory.path" value="$PROJECT_DIR$/course/node_modules/typescript/lib" />
   </component>
   <component name="RecentsManager">
@@ -303,36 +279,37 @@
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="23321000" />
+    <option name="totallyTimeSpent" value="24124000" />
   </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 id="npm" order="2" side_tool="true" />
+      <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" />
-      <window_info anchor="bottom" id="Terminal" order="2" />
+      <window_info active="true" anchor="bottom" id="Terminal" order="2" sideWeight="0.49928468" visible="true" weight="0.3299363" />
       <window_info anchor="bottom" id="Metrics" order="3" />
       <window_info anchor="bottom" id="Message" order="4" />
       <window_info anchor="bottom" id="Find" order="5" weight="0.3299363" />
-      <window_info anchor="bottom" id="Run" order="6" sideWeight="0.49928468" visible="true" weight="0.23694268" />
+      <window_info anchor="bottom" id="Run" order="6" sideWeight="0.4985694" weight="0.23694268" />
       <window_info anchor="bottom" id="Debug" order="7" weight="0.4" />
       <window_info anchor="bottom" id="Cvs" order="8" weight="0.25" />
       <window_info anchor="bottom" id="Inspection" order="9" weight="0.4" />
       <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" />
+      <window_info anchor="bottom" id="TypeScript" order="13" weight="0.3299363" />
       <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.49415693" visible="true" weight="0.25894135" />
+      <window_info anchor="right" content_ui="combo" id="Project" order="5" sideWeight="0.49429658" 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.50584304" side_tool="true" weight="0.25894135" />
+      <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" />
     </layout>
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -515,13 +492,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/course/tsconfig.json">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="360">
-          <caret line="24" column="3" lean-forward="true" selection-start-line="24" selection-start-column="3" selection-end-line="24" selection-end-column="3" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/course/src/tsconfig.app.json">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="195">
@@ -581,5 +551,33 @@
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/course/dist/out-tsc/index.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <caret column="33" lean-forward="true" selection-start-column="33" selection-end-column="33" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/course/package.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="225">
+          <caret line="15" lean-forward="true" selection-start-line="15" selection-end-line="15" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/course/tsconfig.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="420">
+          <caret line="28" selection-start-line="28" selection-end-line="28" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/course/index.ts">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="270">
+          <caret line="18" column="31" selection-start-line="18" selection-start-column="31" selection-end-line="18" selection-end-column="31" />
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>

+ 11 - 109
course/index.ts

@@ -1,117 +1,19 @@
-type PlayerOne = {
-    kind: "playerOne";
-    name: string;
-};
-type PlayerTwo = {
-    kind: "playerTwo";
-    name: string;
-};
-type Player = PlayerOne | PlayerTwo;
-type Point = "love" | "15" | "30";
+type Point = "love" | "15" | "30" | "40";
+
 type Deuce = {
     kind: "deuce";
 };
+
 type PointsData = {
     kind: "points";
-    playerOnePoint: Point;
-    playerTwoPoint: Point;
-};
-type FortyData = {
-    kind: "forty";
-    player: Player;
-    otherPlayerPoint: Point;
-};
-type Advantage = {
-    kind: "advantage",
-    player: Player
-};
-type Game = {
-    kind: "game",
-    player: Player
+    pointsPlayerOne: Point;
+    pointsPlayerTwo: Point;
 };
-type Score = Deuce | PointsData | FortyData | Advantage | Game;
-
-function scoreWhenDeuce(_score: Deuce, player: Player): Advantage {
-    return {
-        kind: "advantage",
-        player
-    };
-}
-
-function scoreWhenAdvantage(score: Advantage, player: Player): Game | Deuce {
-    return player.kind === score.player.kind ?
-        {
-            kind: "game",
-            player: score.player
-        } :
-        {
-            kind: "deuce"
-        };
-}
-
-function incrementPoint(point: Point): "15" | "30" | undefined {
-    switch (point) {
-        case "love":
-            return "15";
-        case "15":
-            return "30";
-        case "30":
-            return undefined;
-    }
-}
-
-function scoreWhenForty(score: FortyData, player: Player): Game | Deuce | FortyData {
-    if (score.player.kind === player.kind) {
-        return {
-            kind: "game",
-            player: player
-        };
-    } else {
-        const newPoints: Point | undefined = incrementPoint(score.otherPlayerPoint);
-        return (newPoints === undefined) ?
-            { kind: "deuce" } :
-            {...score, otherPlayerPoint: newPoints};
-    }
-}
-
-function updatePointsData(score: PointsData, newPoints: Point, player: Player): PointsData {
-    switch (player.kind) {
-        case "playerOne":
-            return {...score, playerOnePoint: newPoints};
-        case "playerTwo":
-            return {...score, playerTwoPoint: newPoints};
-    }
-}
-
-function createFortyData(score: PointsData, player: Player): FortyData {
-    const otherPlayerPoint: Point =  player.kind === "playerOne" ? score.playerTwoPoint : score.playerOnePoint;
-    return {
-        kind: "forty",
-        player,
-        otherPlayerPoint
-    };
-}
 
-function scoreWhenPoints(score: PointsData, player: Player): PointsData | FortyData {
-    const newPoints: Point | undefined = player.kind === "playerOne" ?
-        incrementPoint(score.playerOnePoint) :
-        incrementPoint(score.playerTwoPoint);
-    return newPoints === undefined ?
-        createFortyData(score, player) :
-        updatePointsData(score, newPoints, player);
-}
+type Score = Deuce | PointsData;
 
-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(score, player);
-        case "advantage":
-            return scoreWhenAdvantage(score, player);
-        case "game":
-            return score;
-    }
-}
+const s1: Score = {
+    kind: "points",
+    pointsPlayerOne: "40",
+    pointsPlayerTwo: "40",
+}; // invalid, should be deuce.