@k2works/claude-code-booster 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
  2. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
  3. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
  4. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
  5. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
  24. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
  25. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
  26. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
  27. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
  28. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
  47. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
  48. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
  49. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
  50. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
  51. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
  70. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
  71. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
  72. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
  73. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
  74. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
  93. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
  94. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
  95. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
  96. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
  97. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
  116. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
  117. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
  118. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
  119. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
  120. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
  121. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
  163. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
  164. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
  165. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
  166. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
  167. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
  168. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
  169. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
  170. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
  171. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
  172. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
  173. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
  174. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
  175. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
  176. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
  177. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
  178. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
  179. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
  180. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
  181. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
  182. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
  183. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
  184. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
  185. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
  186. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
  187. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
  188. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
  189. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
  190. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
  191. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
  192. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
  193. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
  194. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
  195. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
  196. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
  197. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
  198. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
  199. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
  200. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
  201. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
  202. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
  203. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
  204. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
  205. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
  206. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
  207. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
  208. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
  209. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
  210. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
  211. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
  212. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
  213. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
  214. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
  215. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
  216. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
  217. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
  218. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
  219. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
  220. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
  221. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
  222. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
  223. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
  224. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
  225. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
  226. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
  227. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
  228. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
  229. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
  230. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
  231. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
  232. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
  233. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
  234. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
  235. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
  236. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
  237. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
  238. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
  239. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
  240. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
  241. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
  242. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
  243. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
  244. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
  245. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
  246. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
  247. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
  248. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
  249. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
  250. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
  251. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
  252. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
  253. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
  254. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
  255. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
  256. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
  257. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
  258. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
  259. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
  260. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
  261. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
  262. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
  263. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
  264. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
  265. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
  266. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
  267. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
  268. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
  269. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
  270. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
  271. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
  272. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
  273. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
  274. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
  275. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
  276. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
  277. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
  278. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
  279. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
  280. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
  281. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
  282. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
  283. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
  284. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
  285. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
  286. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
  287. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
  288. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
  289. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
  290. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
  291. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
  292. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
  293. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
  294. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
  295. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
  296. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
  297. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
  298. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
  299. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
  300. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
  301. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
  302. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
  303. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
  304. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
  305. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
  306. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
  307. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
  308. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
  309. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
  310. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
  311. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
  312. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
  313. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
  314. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
  315. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
  316. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
  317. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
  318. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
  319. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
  320. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
  321. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
  322. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
  323. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
  324. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
  325. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
  326. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
  327. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
  328. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
  329. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
  330. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
  331. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
  332. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
  333. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
  334. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
  335. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
  336. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
  337. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
  338. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
  339. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
  340. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
  341. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
  342. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
  343. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
  344. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
  345. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
  346. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
  347. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
  348. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
  349. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
  350. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
  351. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
  352. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
  353. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
  354. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
  355. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
  356. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
  357. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
  358. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
  359. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
  360. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
  361. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
  362. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
  363. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
  364. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
  365. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
  366. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
  367. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
  368. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
  369. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
  370. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
  371. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
  372. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
  373. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
  374. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
  375. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
  376. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
  377. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
  378. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
  379. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
  380. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
  381. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
  382. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
  383. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
  384. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
  385. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
  386. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
  387. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
  388. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
  389. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
  390. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
  391. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
  392. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
  393. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
  394. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
  395. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
  396. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
  397. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
  398. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
  399. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
  400. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
  401. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
  402. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
  403. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
  404. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
  405. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
  406. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
  407. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
  408. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
  409. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
  410. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
  411. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
  412. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
  413. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
  414. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
  415. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
  416. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
  417. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
  418. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
  419. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
  420. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
  421. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
  422. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
  423. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
  424. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
  425. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
  426. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
  427. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
  428. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
  429. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
  430. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
  431. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
  432. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
  433. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
  434. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
  435. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
  436. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
  437. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
  438. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
  439. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
  440. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
  441. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
  442. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
  443. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
  444. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
  445. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
  446. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
  447. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
  448. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
  449. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
  450. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
  451. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
  452. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
  453. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
  454. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
  455. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
  456. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
  457. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
  458. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
  459. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
  460. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
  461. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
  462. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
  463. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
  464. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
  465. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
  466. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
  467. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
  468. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
  469. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
  470. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
  471. package/lib/assets/docs/article/grokkingfp/index.md +143 -0
  472. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
  473. package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
  474. package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
  475. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
  476. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
  477. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
  478. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
  479. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
  480. package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
  481. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
  482. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
  483. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
  484. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
  485. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
  486. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
  487. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
  488. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
  489. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
  490. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
  491. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
  492. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
  493. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
  494. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
  495. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
  496. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
  497. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
  498. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
  499. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
  500. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
  501. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
  502. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
  503. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
  504. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
  505. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
  506. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
  507. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
  508. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
  509. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
  510. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
  511. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
  512. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
  513. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
  514. package/lib/assets/docs/article/index.md +36 -0
  515. package/lib/assets/docs/design/index.md +39 -27
  516. package/lib/assets/docs/development/index.md +11 -1
  517. package/lib/assets/docs/index.md +33 -106
  518. package/lib/assets/docs/operation/index.md +16 -6
  519. package/lib/assets/docs/reference/index.md +5 -4
  520. package/lib/assets/docs/requirements/index.md +13 -6
  521. package/lib/assets/docs/strategy/index.md +11 -4
  522. package/lib/assets/docs/template/index.md +9 -5
  523. package/lib/assets/mkdocs.yml +29 -17
  524. package/package.json +1 -1
@@ -0,0 +1,353 @@
1
+ # 第15章: ゴシップ好きなバスの運転手
2
+
3
+ ## はじめに
4
+
5
+ 本章では、「ゴシップ好きなバスの運転手」という問題を通じて、関数型プログラミングの実践的なアプローチを学びます。この問題は、バス運転手が停留所で出会ったときに噂を共有するというシミュレーションです。
6
+
7
+ この問題を通じて以下の概念を学びます:
8
+
9
+ - 循環シーケンスによるルート表現
10
+ - 集合演算による状態の伝播
11
+ - データ変換パイプラインの設計
12
+
13
+ ## 1. 問題の説明
14
+
15
+ 複数のバス運転手がそれぞれのルートを巡回しています。各運転手は最初に1つ以上の噂を知っています。同じ停留所に複数の運転手がいると、彼らは知っている噂をすべて共有します。
16
+
17
+ **ゴール**: 全ての運転手が全ての噂を知るまでに何分かかるか?
18
+
19
+ ```plantuml
20
+ @startuml
21
+ title ゴシップ好きなバスの運転手
22
+
23
+ actor "Driver 1" as d1
24
+ actor "Driver 2" as d2
25
+ actor "Driver 3" as d3
26
+
27
+ rectangle "Stop 1" as s1
28
+ rectangle "Stop 2" as s2
29
+ rectangle "Stop 3" as s3
30
+
31
+ d1 --> s1 : 噂A
32
+ d2 --> s1 : 噂B
33
+ d3 --> s2 : 噂C
34
+
35
+ note bottom of s1
36
+ 同じ停留所にいる運転手は
37
+ 噂を共有する
38
+ D1, D2 => {噂A, 噂B}
39
+ end note
40
+ @enduml
41
+ ```
42
+
43
+ ## 2. データモデル
44
+
45
+ ### ドライバーの表現
46
+
47
+ ```fsharp
48
+ /// 噂の型(文字列の集合)
49
+ type Rumors = Set<string>
50
+
51
+ /// ドライバーの型
52
+ type Driver =
53
+ { Name: string
54
+ Route: int list // 元のルート(循環用)
55
+ Position: int // 現在のルート位置
56
+ Rumors: Rumors }
57
+ ```
58
+
59
+ ポイント:
60
+ - `Route` はリストで保持し、`Position` でインデックスを管理
61
+ - 噂は `Set<string>` として管理(集合演算が容易)
62
+
63
+ ### ドライバー操作
64
+
65
+ ```fsharp
66
+ module Driver =
67
+ /// ドライバーを作成
68
+ let create (name: string) (route: int list) (rumors: Rumors) : Driver =
69
+ { Name = name
70
+ Route = route
71
+ Position = 0
72
+ Rumors = rumors }
73
+
74
+ /// 現在の停留所を取得
75
+ let currentStop (driver: Driver) : int =
76
+ driver.Route.[driver.Position % driver.Route.Length]
77
+
78
+ /// 次の停留所に移動
79
+ let move (driver: Driver) : Driver =
80
+ { driver with Position = driver.Position + 1 }
81
+
82
+ /// 噂を追加
83
+ let addRumors (newRumors: Rumors) (driver: Driver) : Driver =
84
+ { driver with Rumors = Set.union driver.Rumors newRumors }
85
+ ```
86
+
87
+ ### 循環ルートの実現
88
+
89
+ ```fsharp
90
+ // Position をルート長で割った余りを使用
91
+ let currentStop (driver: Driver) : int =
92
+ driver.Route.[driver.Position % driver.Route.Length]
93
+
94
+ // 例: ルート [1; 2; 3] の場合
95
+ // Position 0 -> 停留所 1
96
+ // Position 1 -> 停留所 2
97
+ // Position 2 -> 停留所 3
98
+ // Position 3 -> 停留所 1 (3 % 3 = 0)
99
+ ```
100
+
101
+ ```plantuml
102
+ @startuml
103
+ title 循環ルートの実現
104
+
105
+ rectangle "ルート [1, 2, 3]" {
106
+ card "Position 0\n停留所 1" as p0
107
+ card "Position 1\n停留所 2" as p1
108
+ card "Position 2\n停留所 3" as p2
109
+ card "Position 3\n停留所 1" as p3
110
+ card "..." as dots
111
+ p0 --> p1
112
+ p1 --> p2
113
+ p2 --> p3
114
+ p3 --> dots
115
+ }
116
+
117
+ note bottom
118
+ Position % Route.Length で
119
+ 循環を実現
120
+ end note
121
+ @enduml
122
+ ```
123
+
124
+ ## 3. 移動と噂の伝播
125
+
126
+ ### ワールド操作
127
+
128
+ ```fsharp
129
+ /// ワールド = ドライバーのリスト
130
+ type World = Driver list
131
+
132
+ module World =
133
+ /// 全ドライバーを移動
134
+ let moveAll (world: World) : World =
135
+ List.map Driver.move world
136
+
137
+ /// 停留所ごとにドライバーをグループ化
138
+ let groupByStop (world: World) : Map<int, Driver list> =
139
+ world
140
+ |> List.groupBy Driver.currentStop
141
+ |> Map.ofList
142
+
143
+ /// 同じ停留所にいるドライバー間で噂を共有
144
+ let shareRumors (drivers: Driver list) : Driver list =
145
+ let allRumors =
146
+ drivers
147
+ |> List.map (fun d -> d.Rumors)
148
+ |> Set.unionMany
149
+ drivers
150
+ |> List.map (Driver.addRumors allRumors)
151
+
152
+ /// 全停留所で噂を伝播
153
+ let spreadRumors (world: World) : World =
154
+ world
155
+ |> groupByStop
156
+ |> Map.toList
157
+ |> List.map snd
158
+ |> List.map shareRumors
159
+ |> List.concat
160
+ ```
161
+
162
+ ### 噂の共有プロセス
163
+
164
+ ```plantuml
165
+ @startuml
166
+ title 噂の伝播プロセス
167
+
168
+ participant "Driver 1" as d1
169
+ participant "Stop" as stop
170
+ participant "Driver 2" as d2
171
+
172
+ d1 -> stop : 噂 {A, B}
173
+ d2 -> stop : 噂 {C}
174
+
175
+ stop -> stop : Set.unionMany
176
+ note right: {A, B} ∪ {C} = {A, B, C}
177
+
178
+ stop -> d1 : 噂 {A, B, C}
179
+ stop -> d2 : 噂 {A, B, C}
180
+ @enduml
181
+ ```
182
+
183
+ ## 4. シミュレーション
184
+
185
+ ### 1ステップの処理
186
+
187
+ ```fsharp
188
+ /// 1ステップのシミュレーション
189
+ /// 1. 全ドライバーを移動
190
+ /// 2. 同じ停留所にいるドライバー間で噂を共有
191
+ let drive (world: World) : World =
192
+ world
193
+ |> World.moveAll
194
+ |> World.spreadRumors
195
+ ```
196
+
197
+ ### 完了判定
198
+
199
+ ```fsharp
200
+ /// 全ドライバーが同じ噂を持っているか確認
201
+ let allRumorsShared (world: World) : bool =
202
+ match world with
203
+ | [] -> true
204
+ | first :: rest ->
205
+ rest |> List.forall (fun d -> d.Rumors = first.Rumors)
206
+ ```
207
+
208
+ ### シミュレーション実行
209
+
210
+ ```fsharp
211
+ /// シミュレーション結果
212
+ type SimulationResult =
213
+ | Completed of minutes: int
214
+ | Never
215
+
216
+ /// 全噂が共有されるまでシミュレーション
217
+ let driveTillAllRumorsSpread (maxMinutes: int) (world: World) : SimulationResult =
218
+ let rec loop (w: World) (time: int) =
219
+ if time > maxMinutes then
220
+ Never
221
+ elif World.allRumorsShared w then
222
+ Completed time
223
+ else
224
+ loop (drive w) (time + 1)
225
+ loop (drive world) 1
226
+
227
+ /// 480分(8時間)を上限としてシミュレーション
228
+ let simulate (world: World) : SimulationResult =
229
+ driveTillAllRumorsSpread 480 world
230
+ ```
231
+
232
+ ## 5. シーケンス図
233
+
234
+ ```plantuml
235
+ @startuml
236
+ title シミュレーションのフロー
237
+
238
+ participant "Main" as main
239
+ participant "World" as world
240
+ participant "Drivers" as drivers
241
+ participant "Stops" as stops
242
+
243
+ main -> world : simulate
244
+ activate world
245
+
246
+ loop 全噂が共有されるまで(最大480回)
247
+ world -> drivers : moveAll
248
+ activate drivers
249
+ drivers --> world : 移動後のドライバー
250
+ deactivate drivers
251
+
252
+ world -> stops : groupByStop
253
+ activate stops
254
+ stops --> world : 停留所ごとのドライバー
255
+ deactivate stops
256
+
257
+ world -> world : spreadRumors
258
+ note right: 各停留所で噂を共有
259
+
260
+ world -> world : allRumorsShared?
261
+ alt 全噂が共有された
262
+ world --> main : Completed minutes
263
+ else 480分経過
264
+ world --> main : Never
265
+ end
266
+ end
267
+
268
+ deactivate world
269
+ @enduml
270
+ ```
271
+
272
+ ## 6. 使用例
273
+
274
+ ```fsharp
275
+ open FunctionalDesign.Part5.GossipingBusDrivers
276
+
277
+ // 3人のドライバーを作成
278
+ let world = [
279
+ Driver.create "D1" [3; 1; 2; 3] (Set.ofList ["rumor-a"])
280
+ Driver.create "D2" [3; 2; 3; 1] (Set.ofList ["rumor-b"])
281
+ Driver.create "D3" [4; 2; 3; 4; 5] (Set.ofList ["rumor-c"])
282
+ ]
283
+
284
+ // シミュレーション実行
285
+ match simulate world with
286
+ | Completed minutes -> printfn "%d分で全噂が共有されました" minutes
287
+ | Never -> printfn "8時間以内に全噂は共有されませんでした"
288
+
289
+ // 絶対に出会わないルートの場合
290
+ let neverMeet = [
291
+ Driver.create "D1" [1] (Set.ofList ["rumor-a"])
292
+ Driver.create "D2" [2] (Set.ofList ["rumor-b"])
293
+ ]
294
+
295
+ match simulate neverMeet with
296
+ | Never -> printfn "ドライバーは出会いません"
297
+ | Completed _ -> printfn "予期しない結果"
298
+ ```
299
+
300
+ ## 7. 関数型アプローチの特徴
301
+
302
+ ### 不変データ構造
303
+
304
+ すべての状態変更は新しいデータ構造を返します。元のデータは変更されません。
305
+
306
+ ```fsharp
307
+ // ドライバーを移動しても元のドライバーは変更されない
308
+ let original = Driver.create "Test" [1; 2; 3] (Set.ofList ["a"])
309
+ let moved = Driver.move original
310
+
311
+ Driver.currentStop original // 1 (変更なし)
312
+ Driver.currentStop moved // 2
313
+ ```
314
+
315
+ ### 集合演算の活用
316
+
317
+ ```fsharp
318
+ // 複数の集合を統合
319
+ let rumors1 = Set.ofList ["a"; "b"]
320
+ let rumors2 = Set.ofList ["c"]
321
+ let rumors3 = Set.ofList ["a"; "d"]
322
+
323
+ Set.unionMany [rumors1; rumors2; rumors3]
324
+ // Set ["a"; "b"; "c"; "d"]
325
+ ```
326
+
327
+ ### 純粋関数
328
+
329
+ すべての関数は副作用がなく、同じ入力に対して常に同じ出力を返します。
330
+
331
+ ## 8. パターンの応用
332
+
333
+ このパターンは以下のような場面で応用できます:
334
+
335
+ - **ネットワーク伝播**: ウイルスや情報の拡散シミュレーション
336
+ - **グラフ探索**: 巡回セールスマン問題の変形
337
+ - **状態同期**: 分散システムでの状態共有
338
+
339
+ ## まとめ
340
+
341
+ 本章では、ゴシップ好きなバスの運転手問題を通じて以下を学びました:
342
+
343
+ 1. **循環ルート**: モジュロ演算による循環の実現
344
+ 2. **集合演算**: `Set.union`、`Set.unionMany` による状態の統合
345
+ 3. **データ変換パイプライン**: `|>` による処理の連鎖
346
+ 4. **終了条件の設計**: 再帰関数と条件分岐の組み合わせ
347
+
348
+ ## 参考コード
349
+
350
+ 本章のコード例は以下のファイルで確認できます:
351
+
352
+ - ソースコード: `apps/fsharp/part5/src/Library.fs`
353
+ - テストコード: `apps/fsharp/part5/tests/Tests.fs`
@@ -0,0 +1,350 @@
1
+ # 第16章: 給与計算システム
2
+
3
+ ## はじめに
4
+
5
+ 本章では、給与計算システムを通じて、関数型プログラミングで業務ドメインをモデリングする方法を学びます。異なる雇用形態(月給制、時給制、歩合制)に対応した給与計算を、判別共用体とパターンマッチングで実装します。
6
+
7
+ ## 1. 問題の説明
8
+
9
+ 給与計算システムは以下の要件を満たす必要があります:
10
+
11
+ - **月給制従業員**: 固定の月給を支払う
12
+ - **時給制従業員**: 労働時間に基づいて支払う(残業は1.5倍)
13
+ - **歩合制従業員**: 基本給 + 売上に応じた歩合を支払う
14
+
15
+ ```plantuml
16
+ @startuml
17
+ title 給与計算システム
18
+
19
+ class Employee {
20
+ +Id: string
21
+ +Name: string
22
+ +Type: EmployeeType
23
+ }
24
+
25
+ enum EmployeeType {
26
+ Salaried
27
+ Hourly
28
+ Commissioned
29
+ }
30
+
31
+ class TimeCard {
32
+ +Date: DateTime
33
+ +Hours: decimal
34
+ }
35
+
36
+ class SalesReceipt {
37
+ +Date: DateTime
38
+ +Amount: decimal
39
+ }
40
+
41
+ class Payslip {
42
+ +EmployeeId: string
43
+ +GrossPay: decimal
44
+ +PayDate: DateTime
45
+ }
46
+
47
+ Employee --> EmployeeType
48
+ Employee "1" --> "*" TimeCard : 時給制のみ
49
+ Employee "1" --> "*" SalesReceipt : 歩合制のみ
50
+ Employee ..> Payslip : generates
51
+ @enduml
52
+ ```
53
+
54
+ ## 2. データモデル
55
+
56
+ ### 従業員の種類
57
+
58
+ ```fsharp
59
+ /// 従業員の種類
60
+ [<RequireQualifiedAccess>]
61
+ type EmployeeType =
62
+ | Salaried // 月給制
63
+ | Hourly // 時給制
64
+ | Commissioned // 歩合制
65
+ ```
66
+
67
+ ### タイムカードと売上レシート
68
+
69
+ ```fsharp
70
+ /// タイムカードエントリ
71
+ type TimeCard =
72
+ { Date: DateTime
73
+ Hours: decimal }
74
+
75
+ /// 売上レシート
76
+ type SalesReceipt =
77
+ { Date: DateTime
78
+ Amount: decimal }
79
+ ```
80
+
81
+ ### 従業員
82
+
83
+ ```fsharp
84
+ /// 従業員
85
+ type Employee =
86
+ { Id: string
87
+ Name: string
88
+ Type: EmployeeType
89
+ Salary: decimal option // 月給(Salaried, Commissionedの場合)
90
+ HourlyRate: decimal option // 時給(Hourlyの場合)
91
+ CommissionRate: decimal option // 歩合率(Commissionedの場合)
92
+ TimeCards: TimeCard list
93
+ SalesReceipts: SalesReceipt list }
94
+ ```
95
+
96
+ ## 3. 従業員作成
97
+
98
+ ```fsharp
99
+ module Employee =
100
+ /// 月給制従業員を作成
101
+ let createSalaried (id: string) (name: string) (salary: decimal) : Employee =
102
+ { Id = id
103
+ Name = name
104
+ Type = EmployeeType.Salaried
105
+ Salary = Some salary
106
+ HourlyRate = None
107
+ CommissionRate = None
108
+ TimeCards = []
109
+ SalesReceipts = [] }
110
+
111
+ /// 時給制従業員を作成
112
+ let createHourly (id: string) (name: string) (hourlyRate: decimal) : Employee =
113
+ { Id = id
114
+ Name = name
115
+ Type = EmployeeType.Hourly
116
+ Salary = None
117
+ HourlyRate = Some hourlyRate
118
+ CommissionRate = None
119
+ TimeCards = []
120
+ SalesReceipts = [] }
121
+
122
+ /// 歩合制従業員を作成
123
+ let createCommissioned (id: string) (name: string) (salary: decimal) (commissionRate: decimal) : Employee =
124
+ { Id = id
125
+ Name = name
126
+ Type = EmployeeType.Commissioned
127
+ Salary = Some salary
128
+ HourlyRate = None
129
+ CommissionRate = Some commissionRate
130
+ TimeCards = []
131
+ SalesReceipts = [] }
132
+
133
+ /// タイムカードを追加
134
+ let addTimeCard (timeCard: TimeCard) (employee: Employee) : Employee =
135
+ { employee with TimeCards = timeCard :: employee.TimeCards }
136
+
137
+ /// 売上レシートを追加
138
+ let addSalesReceipt (receipt: SalesReceipt) (employee: Employee) : Employee =
139
+ { employee with SalesReceipts = receipt :: employee.SalesReceipts }
140
+ ```
141
+
142
+ ## 4. 給与計算
143
+
144
+ ### 計算ロジック
145
+
146
+ ```fsharp
147
+ module Payroll =
148
+ /// 時給制の給与計算(8時間を超えると1.5倍)
149
+ let calculateHourlyPay (hourlyRate: decimal) (timeCards: TimeCard list) : decimal =
150
+ timeCards
151
+ |> List.sumBy (fun tc ->
152
+ let regularHours = min tc.Hours 8.0m
153
+ let overtimeHours = max (tc.Hours - 8.0m) 0.0m
154
+ (regularHours * hourlyRate) + (overtimeHours * hourlyRate * 1.5m))
155
+
156
+ /// 歩合制の給与計算
157
+ let calculateCommissionPay (baseSalary: decimal) (commissionRate: decimal) (receipts: SalesReceipt list) : decimal =
158
+ let totalSales = receipts |> List.sumBy (fun r -> r.Amount)
159
+ baseSalary + (totalSales * commissionRate)
160
+
161
+ /// 従業員の給与を計算
162
+ let calculatePay (employee: Employee) : decimal =
163
+ match employee.Type with
164
+ | EmployeeType.Salaried ->
165
+ employee.Salary |> Option.defaultValue 0m
166
+ | EmployeeType.Hourly ->
167
+ let rate = employee.HourlyRate |> Option.defaultValue 0m
168
+ calculateHourlyPay rate employee.TimeCards
169
+ | EmployeeType.Commissioned ->
170
+ let salary = employee.Salary |> Option.defaultValue 0m
171
+ let rate = employee.CommissionRate |> Option.defaultValue 0m
172
+ calculateCommissionPay salary rate employee.SalesReceipts
173
+ ```
174
+
175
+ ### 残業計算の図解
176
+
177
+ ```plantuml
178
+ @startuml
179
+ title 時給制の残業計算
180
+
181
+ start
182
+ :労働時間を取得;
183
+
184
+ if (労働時間 > 8時間?) then (yes)
185
+ :通常時間 = 8時間;
186
+ :残業時間 = 労働時間 - 8;
187
+ :給与 = (8 × 時給) + (残業時間 × 時給 × 1.5);
188
+ else (no)
189
+ :通常時間 = 労働時間;
190
+ :給与 = 労働時間 × 時給;
191
+ endif
192
+
193
+ :給与を返す;
194
+ stop
195
+ @enduml
196
+ ```
197
+
198
+ ## 5. 給与明細
199
+
200
+ ### 給与明細の定義
201
+
202
+ ```fsharp
203
+ /// 給与明細
204
+ type Payslip =
205
+ { EmployeeId: string
206
+ EmployeeName: string
207
+ EmployeeType: EmployeeType
208
+ GrossPay: decimal
209
+ PayDate: DateTime }
210
+ ```
211
+
212
+ ### 給与明細の生成
213
+
214
+ ```fsharp
215
+ module Payslip =
216
+ /// 給与明細を生成
217
+ let generate (payDate: DateTime) (employee: Employee) : Payslip =
218
+ { EmployeeId = employee.Id
219
+ EmployeeName = employee.Name
220
+ EmployeeType = employee.Type
221
+ GrossPay = Payroll.calculatePay employee
222
+ PayDate = payDate }
223
+
224
+ /// 複数従業員の給与明細を生成
225
+ let generateAll (payDate: DateTime) (employees: Employee list) : Payslip list =
226
+ employees |> List.map (generate payDate)
227
+ ```
228
+
229
+ ## 6. シーケンス図
230
+
231
+ ```plantuml
232
+ @startuml
233
+ title 給与計算フロー
234
+
235
+ participant "PayrollService" as service
236
+ participant "Employee" as emp
237
+ participant "Payroll" as payroll
238
+ participant "Payslip" as slip
239
+
240
+ service -> emp : 従業員情報取得
241
+ activate emp
242
+ emp --> service : Employee
243
+ deactivate emp
244
+
245
+ service -> payroll : calculatePay(employee)
246
+ activate payroll
247
+
248
+ alt 月給制
249
+ payroll -> payroll : return salary
250
+ else 時給制
251
+ payroll -> payroll : calculateHourlyPay
252
+ note right: タイムカードから計算
253
+ else 歩合制
254
+ payroll -> payroll : calculateCommissionPay
255
+ note right: 基本給 + 売上歩合
256
+ end
257
+
258
+ payroll --> service : 給与額
259
+ deactivate payroll
260
+
261
+ service -> slip : generate(payDate, employee)
262
+ activate slip
263
+ slip --> service : Payslip
264
+ deactivate slip
265
+ @enduml
266
+ ```
267
+
268
+ ## 7. 使用例
269
+
270
+ ```fsharp
271
+ open System
272
+ open FunctionalDesign.Part5.PayrollSystem
273
+
274
+ // 月給制従業員
275
+ let alice = Employee.createSalaried "E001" "Alice" 5000.0m
276
+ let alicePay = Payroll.calculatePay alice
277
+ // 5000.0m
278
+
279
+ // 時給制従業員(残業あり)
280
+ let bob =
281
+ Employee.createHourly "E002" "Bob" 25.0m
282
+ |> Employee.addTimeCard { Date = DateTime(2024, 1, 15); Hours = 10.0m }
283
+ |> Employee.addTimeCard { Date = DateTime(2024, 1, 16); Hours = 8.0m }
284
+ let bobPay = Payroll.calculatePay bob
285
+ // (8 * 25) + (2 * 25 * 1.5) + (8 * 25) = 200 + 75 + 200 = 475
286
+
287
+ // 歩合制従業員
288
+ let charlie =
289
+ Employee.createCommissioned "E003" "Charlie" 2000.0m 0.10m
290
+ |> Employee.addSalesReceipt { Date = DateTime(2024, 1, 15); Amount = 5000.0m }
291
+ let charliePay = Payroll.calculatePay charlie
292
+ // 2000 + 5000 * 0.10 = 2500
293
+
294
+ // 給与明細の生成
295
+ let payDate = DateTime(2024, 1, 31)
296
+ let slips = Payslip.generateAll payDate [alice; bob; charlie]
297
+ ```
298
+
299
+ ## 8. 関数型アプローチの特徴
300
+
301
+ ### パターンマッチングによる分岐
302
+
303
+ ```fsharp
304
+ match employee.Type with
305
+ | EmployeeType.Salaried -> ...
306
+ | EmployeeType.Hourly -> ...
307
+ | EmployeeType.Commissioned -> ...
308
+ ```
309
+
310
+ コンパイラが網羅性をチェックするため、新しい従業員タイプを追加した場合にすべての分岐を更新する必要があることが保証されます。
311
+
312
+ ### Option 型による安全な値アクセス
313
+
314
+ ```fsharp
315
+ employee.Salary |> Option.defaultValue 0m
316
+ ```
317
+
318
+ `null` チェックの代わりに `Option` 型を使用し、安全にデフォルト値を適用します。
319
+
320
+ ### イミュータブルなデータ操作
321
+
322
+ ```fsharp
323
+ // 元のデータは変更されず、新しいデータが返される
324
+ let updatedEmployee = Employee.addTimeCard timeCard employee
325
+ ```
326
+
327
+ ## 9. 拡張ポイント
328
+
329
+ このシステムは以下のように拡張できます:
330
+
331
+ - **税金計算**: 給与から税金を控除
332
+ - **福利厚生**: 健康保険、年金などの控除
333
+ - **支払いスケジュール**: 週払い、隔週払い、月払いの対応
334
+ - **休暇管理**: 有給休暇の追跡と給与への反映
335
+
336
+ ## まとめ
337
+
338
+ 本章では、給与計算システムを通じて以下を学びました:
339
+
340
+ 1. **判別共用体**: 従業員タイプの表現
341
+ 2. **パターンマッチング**: 型に基づく給与計算の分岐
342
+ 3. **Option 型**: 安全な値アクセス
343
+ 4. **データ変換**: 従業員情報から給与明細への変換
344
+
345
+ ## 参考コード
346
+
347
+ 本章のコード例は以下のファイルで確認できます:
348
+
349
+ - ソースコード: `apps/fsharp/part5/src/Library.fs`
350
+ - テストコード: `apps/fsharp/part5/tests/Tests.fs`