@k2works/claude-code-booster 2.7.1 → 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 (527) 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 -103
  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/review/index.md +5 -0
  522. package/lib/assets/docs/strategy/index.md +15 -0
  523. package/lib/assets/docs/template/index.md +9 -5
  524. package/lib/assets/mkdocs.yml +33 -19
  525. package/package.json +1 -1
  526. package/lib/assets/docs/analysis/index.md +0 -8
  527. /package/lib/assets/docs/{analysis → strategy}/slide/.gitkeep +0 -0
@@ -0,0 +1,285 @@
1
+ # 第 9 章: SOLID 原則とモジュール設計
2
+
3
+ ## 9.1 はじめに
4
+
5
+ 前章までに多くのデザインパターンを適用しましたが、すべてのクラスが 1 つのファイルに詰め込まれた状態です。この章では **SOLID 原則** の観点からコードを検証し、責務に基づいた **モジュール設計** を行います。
6
+
7
+ ## 9.2 SOLID 原則の検証
8
+
9
+ ### 単一責任原則(SRP: Single Responsibility Principle)
10
+
11
+ > クラスが変更される理由は一つでなければならない
12
+
13
+ | クラス | 責務 | 変更理由 |
14
+ |--------|------|---------|
15
+ | `FizzBuzzValue` | FizzBuzz の結果値を表現 | 値の表現方法が変わるとき |
16
+ | `FizzBuzzList` | FizzBuzz の結果コレクションを管理 | コレクション操作が変わるとき |
17
+ | `FizzBuzzType01` | タイプ 1 の変換ルール | タイプ 1 のルールが変わるとき |
18
+ | `FizzBuzzType02` | タイプ 2 の変換ルール | タイプ 2 のルールが変わるとき |
19
+ | `FizzBuzzType03` | タイプ 3 の変換ルール | タイプ 3 のルールが変わるとき |
20
+ | `FizzBuzzValueCommand` | 単一値の生成操作 | 値の生成方法が変わるとき |
21
+ | `FizzBuzzListCommand` | リストの生成操作 | リストの生成方法が変わるとき |
22
+
23
+ 各クラスが 1 つの責務を持ち、変更理由は 1 つです。SRP を満たしています。
24
+
25
+ ### 開放閉鎖原則(OCP: Open-Closed Principle)
26
+
27
+ > ソフトウェアエンティティは拡張に対して開いていて、修正に対して閉じている
28
+
29
+ 新しいタイプ(例: タイプ 4)を追加する場合:
30
+
31
+ 1. `FizzBuzzType04` クラスを **新規作成** する
32
+ 2. `FizzBuzzType.create()` の switch 文に 1 行 **追加** する
33
+
34
+ 既存の `FizzBuzzType01`〜`03` は一切変更しません。OCP を満たしています。
35
+
36
+ ### 依存関係逆転の原則(DIP: Dependency Inversion Principle)
37
+
38
+ > 上位レベルのモジュールは下位レベルのモジュールに依存してはならない。両方とも抽象に依存すべき
39
+
40
+ ```
41
+ FizzBuzzValueCommand ──→ FizzBuzzType (抽象)
42
+ FizzBuzzListCommand ──→ FizzBuzzType (抽象)
43
+
44
+ FizzBuzzType01, Type02, Type03
45
+ ```
46
+
47
+ - コマンド(上位)は抽象クラス `FizzBuzzType` に依存
48
+ - 具体的な Type01〜03 には直接依存しない
49
+ - DIP を満たしています
50
+
51
+ ## 9.3 モジュール設計
52
+
53
+ ### 設計方針
54
+
55
+ 責務に基づいて 3 つのレイヤーに分割します。
56
+
57
+ | レイヤー | 配置先 | 責務 |
58
+ |---------|-------|------|
59
+ | **ドメインモデル** | `domain/model/` | 値オブジェクト、コレクション |
60
+ | **ドメインタイプ** | `domain/type/` | ビジネスルール(FizzBuzz 変換) |
61
+ | **アプリケーション** | `application/` | 操作の実行(コマンド) |
62
+
63
+ ### ディレクトリ構成
64
+
65
+ ```
66
+ src/
67
+ ├── index.ts (エントリポイント)
68
+ └── fizzbuzz/
69
+ ├── index.ts (バレルファイル: 全クラスを re-export)
70
+ ├── domain/
71
+ │ ├── model/
72
+ │ │ ├── fizz-buzz-value.ts (FizzBuzzValue)
73
+ │ │ └── fizz-buzz-list.ts (FizzBuzzList)
74
+ │ └── type/
75
+ │ ├── fizz-buzz-type.ts (FizzBuzzType abstract + create)
76
+ │ ├── fizz-buzz-type-01.ts (FizzBuzzType01)
77
+ │ ├── fizz-buzz-type-02.ts (FizzBuzzType02)
78
+ │ └── fizz-buzz-type-03.ts (FizzBuzzType03)
79
+ └── application/
80
+ ├── fizz-buzz-command.ts (FizzBuzzCommand interface)
81
+ ├── fizz-buzz-value-command.ts (FizzBuzzValueCommand)
82
+ └── fizz-buzz-list-command.ts (FizzBuzzListCommand)
83
+ ```
84
+
85
+ ### 依存関係
86
+
87
+ ```
88
+ application/ ──→ domain/type/ ──→ domain/model/
89
+ ↓ ↓ ↓
90
+ コマンド タイプ 値・コレクション
91
+ ```
92
+
93
+ - `domain/model/` は他のモジュールに依存しない(最も安定)
94
+ - `domain/type/` は `domain/model/` のみに依存
95
+ - `application/` は `domain/type/` と `domain/model/` に依存
96
+
97
+ ### バレルファイル(index.ts)
98
+
99
+ TypeScript では **バレルファイル** を使って、モジュールの公開 API を集約します。
100
+
101
+ ```typescript
102
+ // src/fizzbuzz/index.ts
103
+ export { FizzBuzzValue } from "./domain/model/fizz-buzz-value.js";
104
+ export { FizzBuzzList } from "./domain/model/fizz-buzz-list.js";
105
+ export { FizzBuzzType } from "./domain/type/fizz-buzz-type.js";
106
+ export { FizzBuzzType01 } from "./domain/type/fizz-buzz-type-01.js";
107
+ export { FizzBuzzType02 } from "./domain/type/fizz-buzz-type-02.js";
108
+ export { FizzBuzzType03 } from "./domain/type/fizz-buzz-type-03.js";
109
+ export type { FizzBuzzCommand } from "./application/fizz-buzz-command.js";
110
+ export { FizzBuzzValueCommand } from "./application/fizz-buzz-value-command.js";
111
+ export { FizzBuzzListCommand } from "./application/fizz-buzz-list-command.js";
112
+ ```
113
+
114
+ 利用側は 1 つの import パスですべてのクラスにアクセスできます:
115
+
116
+ ```typescript
117
+ import {
118
+ FizzBuzzType,
119
+ FizzBuzzValueCommand,
120
+ FizzBuzzListCommand,
121
+ } from "./fizzbuzz/index";
122
+ ```
123
+
124
+ ## 9.4 エントリポイントの更新
125
+
126
+ ```typescript
127
+ // src/index.ts
128
+ export {
129
+ FizzBuzzValue,
130
+ FizzBuzzList,
131
+ FizzBuzzType,
132
+ FizzBuzzType01,
133
+ FizzBuzzType02,
134
+ FizzBuzzType03,
135
+ FizzBuzzValueCommand,
136
+ FizzBuzzListCommand,
137
+ } from "./fizzbuzz/index.js";
138
+ ```
139
+
140
+ ## 9.5 テストの再編成
141
+
142
+ テストもモジュール構造に合わせて分割します。
143
+
144
+ ```
145
+ test/
146
+ └── fizzbuzz/
147
+ ├── domain/
148
+ │ ├── model/
149
+ │ │ ├── fizz-buzz-value.test.ts
150
+ │ │ └── fizz-buzz-list.test.ts
151
+ │ └── type/
152
+ │ └── fizz-buzz-type.test.ts
153
+ └── application/
154
+ └── fizz-buzz-command.test.ts
155
+ ```
156
+
157
+ ### fizz-buzz-type.test.ts
158
+
159
+ ```typescript
160
+ import { describe, expect, test } from "vitest";
161
+ import {
162
+ FizzBuzzType,
163
+ FizzBuzzType01,
164
+ FizzBuzzType02,
165
+ FizzBuzzType03,
166
+ } from "../../../../src/fizzbuzz/index";
167
+
168
+ describe("FizzBuzzType", () => {
169
+ describe("タイプ1の場合", () => {
170
+ const type = FizzBuzzType.create(FizzBuzzType.TYPE_01);
171
+
172
+ test("1を渡したら文字列1を返す", () => {
173
+ expect(type.generate(1).toString()).toBe("1");
174
+ });
175
+
176
+ test("3を渡したらFizzを返す", () => {
177
+ expect(type.generate(3).toString()).toBe("Fizz");
178
+ });
179
+
180
+ test("5を渡したらBuzzを返す", () => {
181
+ expect(type.generate(5).toString()).toBe("Buzz");
182
+ });
183
+
184
+ test("15を渡したらFizzBuzzを返す", () => {
185
+ expect(type.generate(15).toString()).toBe("FizzBuzz");
186
+ });
187
+ });
188
+
189
+ describe("ファクトリメソッド", () => {
190
+ test("TYPE_01 を指定すると FizzBuzzType01 が返る", () => {
191
+ expect(FizzBuzzType.create(FizzBuzzType.TYPE_01)).toBeInstanceOf(
192
+ FizzBuzzType01,
193
+ );
194
+ });
195
+
196
+ test("未定義のタイプを指定するとエラーが発生する", () => {
197
+ expect(() => FizzBuzzType.create(99)).toThrow("未定義のタイプ: 99");
198
+ });
199
+ });
200
+ });
201
+ ```
202
+
203
+ ### fizz-buzz-command.test.ts
204
+
205
+ ```typescript
206
+ import { describe, expect, test } from "vitest";
207
+ import {
208
+ FizzBuzzListCommand,
209
+ FizzBuzzType,
210
+ FizzBuzzValueCommand,
211
+ } from "../../../src/fizzbuzz/index";
212
+
213
+ describe("FizzBuzzCommand", () => {
214
+ test("FizzBuzzValueCommand は単一の値を生成する", () => {
215
+ const type = FizzBuzzType.create(FizzBuzzType.TYPE_01);
216
+ const command = new FizzBuzzValueCommand(type, 3);
217
+ const result = command.execute();
218
+ expect(result.toString()).toBe("Fizz");
219
+ });
220
+
221
+ test("FizzBuzzListCommand はリストを生成する", () => {
222
+ const type = FizzBuzzType.create(FizzBuzzType.TYPE_01);
223
+ const command = new FizzBuzzListCommand(type, 100);
224
+ const result = command.execute();
225
+ expect(result.size).toBe(100);
226
+ });
227
+ });
228
+ ```
229
+
230
+ ### テスト実行結果
231
+
232
+ ```
233
+ ✓ test/fizzbuzz/domain/model/fizz-buzz-value.test.ts (4 tests) 2ms
234
+ ✓ test/fizzbuzz/domain/model/fizz-buzz-list.test.ts (4 tests) 2ms
235
+ ✓ test/fizzbuzz/domain/type/fizz-buzz-type.test.ts (16 tests) 1ms
236
+ ✓ test/fizzbuzz/application/fizz-buzz-command.test.ts (3 tests) 2ms
237
+
238
+ Test Files 4 passed (4)
239
+ Tests 27 passed (27)
240
+ ```
241
+
242
+ ## 9.6 各言語のモジュール設計比較
243
+
244
+ | 概念 | TypeScript | Java | Python |
245
+ |------|-----------|------|--------|
246
+ | モジュール単位 | ファイル(ES Modules) | パッケージ | パッケージ |
247
+ | 公開制御 | `export` / non-export | `public` / package-private | `__all__` / `_` 規約 |
248
+ | バレルファイル | `index.ts` の re-export | パッケージの public class | `__init__.py` |
249
+ | 名前空間 | ファイルパス | パッケージ名 | モジュールパス |
250
+ | 循環依存対策 | バレルファイルで集約 | パッケージ設計で制御 | `__init__.py` で制御 |
251
+
252
+ ## 9.7 まとめ
253
+
254
+ 第 3 部(章 7〜9)を通じて、手続き的な FizzBuzz を OOP 設計に進化させました。
255
+
256
+ | 章 | テーマ | 適用したパターン |
257
+ |---|--------|---------------|
258
+ | 7 | カプセル化とポリモーフィズム | Strategy パターン、ファクトリメソッド |
259
+ | 8 | デザインパターンの適用 | Value Object、First-Class Collection、Command パターン |
260
+ | 9 | SOLID 原則とモジュール設計 | SRP、OCP、DIP、モジュール分割 |
261
+
262
+ ### Before / After
263
+
264
+ **Before**(第 2 部終了時):
265
+
266
+ ```
267
+ src/fizzbuzz.ts (1 ファイル、1 クラス)
268
+ test/fizzbuzz.test.ts (1 ファイル)
269
+ ```
270
+
271
+ **After**(第 3 部終了時):
272
+
273
+ ```
274
+ src/fizzbuzz/
275
+ ├── domain/model/ (値オブジェクト、コレクション)
276
+ ├── domain/type/ (ビジネスルール)
277
+ └── application/ (コマンド)
278
+
279
+ test/fizzbuzz/
280
+ ├── domain/model/ (値・コレクションのテスト)
281
+ ├── domain/type/ (タイプのテスト)
282
+ └── application/ (コマンドのテスト)
283
+ ```
284
+
285
+ 次の第 4 部では、関数型プログラミングの観点から FizzBuzz を再構成し、高階関数、不変データ、型安全なエラーハンドリングを学びます。
@@ -0,0 +1,199 @@
1
+ # 第 10 章: 高階関数と関数合成
2
+
3
+ ## 10.1 はじめに
4
+
5
+ 第 3 部ではオブジェクト指向設計でコードを構造化しました。第 4 部では **関数型プログラミング** の観点から FizzBuzz を再構成し、JavaScript/TypeScript の関数型機能を学びます。
6
+
7
+ この章では、**高階関数**(Higher-Order Functions)と **関数合成**(Function Composition)を使って、コレクション操作をより宣言的に記述します。
8
+
9
+ ## 10.2 アロー関数と高階関数
10
+
11
+ ### アロー関数
12
+
13
+ TypeScript/JavaScript のアロー関数は、関数型プログラミングの基本です。
14
+
15
+ ```typescript
16
+ // 従来の関数
17
+ function double(n: number): number {
18
+ return n * 2;
19
+ }
20
+
21
+ // アロー関数
22
+ const double = (n: number): number => n * 2;
23
+ ```
24
+
25
+ ### 高階関数とは
26
+
27
+ **高階関数** とは、関数を引数に取るか、関数を返す関数です。JavaScript の配列メソッド `map`、`filter`、`reduce` は代表的な高階関数です。
28
+
29
+ ## 10.3 FizzBuzzList への関数型メソッドの追加
30
+
31
+ ### map: 各要素を変換
32
+
33
+ ```typescript
34
+ map(fn: (value: FizzBuzzValue) => FizzBuzzValue): FizzBuzzList {
35
+ return new FizzBuzzList(this._list.map(fn));
36
+ }
37
+ ```
38
+
39
+ **特徴**: 元のリストを変更せず、新しいリストを返します(不変性)。
40
+
41
+ ### filter: 条件に合う要素のみ抽出
42
+
43
+ ```typescript
44
+ filter(predicate: (value: FizzBuzzValue) => boolean): FizzBuzzList {
45
+ return new FizzBuzzList(this._list.filter(predicate));
46
+ }
47
+ ```
48
+
49
+ ### reduce: 畳み込み
50
+
51
+ ```typescript
52
+ reduce<T>(fn: (acc: T, value: FizzBuzzValue) => T, initial: T): T {
53
+ return this._list.reduce(fn, initial);
54
+ }
55
+ ```
56
+
57
+ ### テスト
58
+
59
+ ```typescript
60
+ describe("関数型メソッド", () => {
61
+ const baseList = new FizzBuzzList([
62
+ new FizzBuzzValue("1", 1),
63
+ new FizzBuzzValue("Fizz", 3),
64
+ new FizzBuzzValue("Buzz", 5),
65
+ new FizzBuzzValue("FizzBuzz", 15),
66
+ ]);
67
+
68
+ test("map で値を変換する", () => {
69
+ const mapped = baseList.map(
70
+ (v) => new FizzBuzzValue(v.toString().toUpperCase(), v.number),
71
+ );
72
+ expect(mapped.toStringArray()).toEqual(["1", "FIZZ", "BUZZ", "FIZZBUZZ"]);
73
+ // 元のリストは変更されない
74
+ expect(baseList.toStringArray()).toEqual(["1", "Fizz", "Buzz", "FizzBuzz"]);
75
+ });
76
+
77
+ test("filter で Fizz のみ抽出できる", () => {
78
+ const filtered = baseList.filter((v) => v.value === "Fizz");
79
+ expect(filtered.toStringArray()).toEqual(["Fizz"]);
80
+ });
81
+
82
+ test("reduce で文字列結合できる", () => {
83
+ const reduced = baseList.reduce(
84
+ (acc, v) => `${acc}${acc.length > 0 ? "," : ""}${v.toString()}`,
85
+ "",
86
+ );
87
+ expect(reduced).toBe("1,Fizz,Buzz,FizzBuzz");
88
+ });
89
+ });
90
+ ```
91
+
92
+ ## 10.4 FizzBuzzListCommand の関数的リファクタリング
93
+
94
+ ### Before: for ループ
95
+
96
+ ```typescript
97
+ execute(): FizzBuzzList {
98
+ let list = new FizzBuzzList();
99
+ for (let i = 1; i <= this._count; i++) {
100
+ list = list.add(this._type.generate(i));
101
+ }
102
+ return list;
103
+ }
104
+ ```
105
+
106
+ ### After: Array.from + reduce
107
+
108
+ ```typescript
109
+ execute(): FizzBuzzList {
110
+ return Array.from({ length: this._count }, (_, i) => i + 1).reduce(
111
+ (list, num) => list.add(this._type.generate(num)),
112
+ new FizzBuzzList(),
113
+ );
114
+ }
115
+ ```
116
+
117
+ **変更点**:
118
+
119
+ - `for` ループを `Array.from` + `reduce` に置き換え
120
+ - 宣言的な記述に変更(「何を」するかが明確)
121
+ - 既存のテストはすべてそのまま通過
122
+
123
+ ## 10.5 関数合成ユーティリティ
124
+
125
+ ### compose と pipe
126
+
127
+ ```typescript
128
+ // compose: 右から左に合成 f(g(x))
129
+ export const compose =
130
+ <T>(...fns: ((arg: T) => T)[]): ((arg: T) => T) =>
131
+ (arg: T) =>
132
+ fns.reduceRight((acc, fn) => fn(acc), arg);
133
+
134
+ // pipe: 左から右に合成 g(f(x))
135
+ export const pipe =
136
+ <T>(...fns: ((arg: T) => T)[]): ((arg: T) => T) =>
137
+ (arg: T) =>
138
+ fns.reduce((acc, fn) => fn(acc), arg);
139
+ ```
140
+
141
+ ### フィルタ述語関数
142
+
143
+ カリー化されたフィルタ関数で、再利用可能な述語を定義します。
144
+
145
+ ```typescript
146
+ export const isFizz = (v: FizzBuzzValue): boolean => v.value === "Fizz";
147
+ export const isBuzz = (v: FizzBuzzValue): boolean => v.value === "Buzz";
148
+ export const isFizzBuzz = (v: FizzBuzzValue): boolean => v.value === "FizzBuzz";
149
+ export const isNumber = (v: FizzBuzzValue): boolean => !isNaN(Number(v.value));
150
+ ```
151
+
152
+ ### テスト
153
+
154
+ ```typescript
155
+ describe("関数合成", () => {
156
+ test("compose は右から左に適用する", () => {
157
+ const double = (n: number): number => n * 2;
158
+ const increment = (n: number): number => n + 1;
159
+ const fn = compose(double, increment);
160
+ expect(fn(3)).toBe(8); // double(increment(3)) = double(4) = 8
161
+ });
162
+
163
+ test("pipe は左から右に適用する", () => {
164
+ const double = (n: number): number => n * 2;
165
+ const increment = (n: number): number => n + 1;
166
+ const fn = pipe(double, increment);
167
+ expect(fn(3)).toBe(7); // increment(double(3)) = increment(6) = 7
168
+ });
169
+ });
170
+
171
+ describe("フィルタ関数", () => {
172
+ test("isFizz は Fizz のとき true を返す", () => {
173
+ expect(isFizz(new FizzBuzzValue("Fizz", 3))).toBe(true);
174
+ expect(isFizz(new FizzBuzzValue("Buzz", 5))).toBe(false);
175
+ });
176
+ });
177
+ ```
178
+
179
+ ## 10.6 各言語の高階関数比較
180
+
181
+ | 概念 | TypeScript | Java | Python |
182
+ |------|-----------|------|--------|
183
+ | ラムダ式 | `(x) => x * 2` | `x -> x * 2` | `lambda x: x * 2` |
184
+ | map | `array.map(fn)` | `stream.map(fn)` | `map(fn, list)` / 内包表記 |
185
+ | filter | `array.filter(fn)` | `stream.filter(fn)` | `filter(fn, list)` / 内包表記 |
186
+ | reduce | `array.reduce(fn, init)` | `stream.reduce(init, fn)` | `functools.reduce(fn, list, init)` |
187
+ | 関数合成 | `compose(f, g)` / `pipe(f, g)` | `f.andThen(g)` / `f.compose(g)` | `functools.reduce` で実装 |
188
+ | 述語関数 | `const isFizz = (v) => ...` | `Predicate<T>` インターフェース | `def is_fizz(v): ...` |
189
+
190
+ ## 10.7 まとめ
191
+
192
+ この章で学んだこと:
193
+
194
+ 1. **アロー関数**: 簡潔な関数リテラルで高階関数を活用
195
+ 2. **map/filter/reduce**: コレクションの宣言的操作
196
+ 3. **関数合成**: `compose`(右→左)と `pipe`(左→右)で関数を組み合わせ
197
+ 4. **述語関数**: 再利用可能なフィルタ条件を関数として定義
198
+
199
+ 次の章では、不変データの原則をさらに深め、パイプライン処理でデータを変換するパターンを学びます。
@@ -0,0 +1,207 @@
1
+ # 第 11 章: 不変データとパイプライン処理
2
+
3
+ ## 11.1 はじめに
4
+
5
+ 前章では高階関数と関数合成を学びました。この章では **不変データ** の原則をさらに深め、**パイプライン処理** でデータを流れるように変換するパターンを学びます。
6
+
7
+ ## 11.2 不変データの原則
8
+
9
+ ### 既存の不変設計
10
+
11
+ 第 3 部で実装した FizzBuzzList は既に不変性を備えています。
12
+
13
+ | メカニズム | 実装方法 |
14
+ |-----------|---------|
15
+ | **フィールドの凍結** | `Object.freeze([...list])` |
16
+ | **不変な追加** | `add()` は新しいインスタンスを返す |
17
+ | **readonly 型** | `readonly FizzBuzzValue[]` で型レベルの保護 |
18
+ | **private フィールド** | 外部から直接変更不可 |
19
+
20
+ ### TypeScript の不変性サポート
21
+
22
+ | 手法 | 用途 |
23
+ |------|------|
24
+ | `readonly` 修飾子 | プロパティの再代入を防止 |
25
+ | `ReadonlyArray<T>` | 配列の変更メソッドを型レベルで禁止 |
26
+ | `Object.freeze()` | 実行時にオブジェクトの変更を防止 |
27
+ | `as const` | リテラル型の推論と readonly 化 |
28
+ | Spread 演算子 | `{...obj}` / `[...arr]` でシャローコピー |
29
+
30
+ ## 11.3 パイプライン処理メソッド
31
+
32
+ ### groupBy: 値の種類ごとにグループ化
33
+
34
+ ```typescript
35
+ groupBy(fn: (value: FizzBuzzValue) => string): Map<string, FizzBuzzList> {
36
+ return this._list.reduce((groups, value) => {
37
+ const key = fn(value);
38
+ const group = groups.get(key) ?? new FizzBuzzList();
39
+ groups.set(key, group.add(value));
40
+ return groups;
41
+ }, new Map<string, FizzBuzzList>());
42
+ }
43
+ ```
44
+
45
+ ### countBy: 種類ごとの出現回数をカウント
46
+
47
+ ```typescript
48
+ countBy(fn: (value: FizzBuzzValue) => string): Map<string, number> {
49
+ return this._list.reduce((counts, value) => {
50
+ const key = fn(value);
51
+ counts.set(key, (counts.get(key) ?? 0) + 1);
52
+ return counts;
53
+ }, new Map<string, number>());
54
+ }
55
+ ```
56
+
57
+ ### take / first / join
58
+
59
+ ```typescript
60
+ take(n: number): FizzBuzzList {
61
+ return new FizzBuzzList(this._list.slice(0, Math.max(0, n)));
62
+ }
63
+
64
+ first(): FizzBuzzValue | undefined {
65
+ return this._list[0];
66
+ }
67
+
68
+ join(separator: string): string {
69
+ return this._list.map((value) => value.toString()).join(separator);
70
+ }
71
+ ```
72
+
73
+ ## 11.4 ジェネレータベースの生成
74
+
75
+ ### ジェネレータ関数
76
+
77
+ TypeScript の `function*` でジェネレータを定義し、遅延評価でシーケンスを生成します。
78
+
79
+ ```typescript
80
+ private static *sequence(
81
+ type: FizzBuzzGenerator,
82
+ count: number,
83
+ ): Generator<FizzBuzzValue> {
84
+ for (let number = 1; number <= count; number += 1) {
85
+ yield type.generate(number);
86
+ }
87
+ }
88
+
89
+ static generate(type: FizzBuzzGenerator, count: number): FizzBuzzList {
90
+ return new FizzBuzzList([...FizzBuzzList.sequence(type, count)]);
91
+ }
92
+ ```
93
+
94
+ ### 循環参照の回避
95
+
96
+ `FizzBuzzType` を直接 import すると循環参照が発生するため、構造的型付けで回避します。
97
+
98
+ ```typescript
99
+ type FizzBuzzGenerator = {
100
+ generate(number: number): FizzBuzzValue;
101
+ };
102
+ ```
103
+
104
+ TypeScript のダックタイピングにより、`FizzBuzzType` のインスタンスは `FizzBuzzGenerator` 型を自動的に満たします。
105
+
106
+ ## 11.5 テスト
107
+
108
+ ### パイプライン処理テスト
109
+
110
+ ```typescript
111
+ describe("パイプライン処理", () => {
112
+ const type = FizzBuzzType.create(FizzBuzzType.TYPE_01);
113
+ const list = FizzBuzzList.generate(type, 15);
114
+
115
+ test("groupBy で値の種類ごとにグループ化する", () => {
116
+ const groups = list.groupBy((v) => {
117
+ if (v.value === "FizzBuzz") return "FizzBuzz";
118
+ if (v.value === "Fizz") return "Fizz";
119
+ if (v.value === "Buzz") return "Buzz";
120
+ return "number";
121
+ });
122
+ expect(groups.get("Fizz")?.size).toBe(4);
123
+ expect(groups.get("Buzz")?.size).toBe(2);
124
+ expect(groups.get("FizzBuzz")?.size).toBe(1);
125
+ expect(groups.get("number")?.size).toBe(8);
126
+ });
127
+
128
+ test("countBy で種類ごとの出現回数をカウントする", () => {
129
+ const counts = list.countBy((v) => {
130
+ if (v.value === "FizzBuzz") return "FizzBuzz";
131
+ if (v.value === "Fizz") return "Fizz";
132
+ if (v.value === "Buzz") return "Buzz";
133
+ return "number";
134
+ });
135
+ expect(counts.get("Fizz")).toBe(4);
136
+ expect(counts.get("FizzBuzz")).toBe(1);
137
+ });
138
+
139
+ test("take で先頭N件を取得する", () => {
140
+ expect(list.take(3).toStringArray()).toEqual(["1", "2", "Fizz"]);
141
+ });
142
+
143
+ test("first で最初の要素を取得する", () => {
144
+ expect(list.first()?.toString()).toBe("1");
145
+ });
146
+
147
+ test("join で文字列結合する", () => {
148
+ expect(list.take(5).join(", ")).toBe("1, 2, Fizz, 4, Buzz");
149
+ });
150
+
151
+ test("メソッドチェーンでパイプライン処理する", () => {
152
+ const result = list
153
+ .filter((v) => v.value === "Fizz")
154
+ .take(2)
155
+ .join(", ");
156
+ expect(result).toBe("Fizz, Fizz");
157
+ });
158
+ });
159
+ ```
160
+
161
+ ### 静的生成メソッドテスト
162
+
163
+ ```typescript
164
+ describe("静的生成メソッド", () => {
165
+ test("generate でリストを生成する", () => {
166
+ const type = FizzBuzzType.create(FizzBuzzType.TYPE_01);
167
+ const list = FizzBuzzList.generate(type, 15);
168
+ expect(list.size).toBe(15);
169
+ expect(list.first()?.toString()).toBe("1");
170
+ });
171
+ });
172
+ ```
173
+
174
+ ### テスト実行結果
175
+
176
+ ```
177
+ ✓ test/fizzbuzz/domain/model/fizz-buzz-list.test.ts (15 tests) 10ms
178
+ ✓ test/fizzbuzz/domain/model/fizz-buzz-value.test.ts (4 tests) 3ms
179
+ ✓ test/fizzbuzz/domain/type/fizz-buzz-type.test.ts (16 tests) 7ms
180
+ ✓ test/fizzbuzz/domain/type/fizz-buzz-util.test.ts (6 tests) 4ms
181
+ ✓ test/fizzbuzz/application/fizz-buzz-command.test.ts (3 tests) 4ms
182
+
183
+ Test Files 5 passed (5)
184
+ Tests 44 passed (44)
185
+ ```
186
+
187
+ ## 11.6 各言語のパイプライン比較
188
+
189
+ | 概念 | TypeScript | Java | Python |
190
+ |------|-----------|------|--------|
191
+ | パイプライン | メソッドチェーン | Stream API | ジェネレータ + itertools |
192
+ | グループ化 | `Map` + `reduce` | `Collectors.groupingBy()` | `dict` + ループ |
193
+ | 遅延評価 | `function*` ジェネレータ | `Stream` の中間操作 | `yield` ジェネレータ |
194
+ | 不変コピー | Spread `[...arr]` | `Collections.unmodifiableList()` | `tuple` / `frozenset` |
195
+ | 結合 | `array.join()` | `Collectors.joining()` | `str.join()` |
196
+
197
+ ## 11.7 まとめ
198
+
199
+ この章で学んだこと:
200
+
201
+ 1. **不変データ**: `Object.freeze()`、`readonly`、Spread 演算子で不変性を保証
202
+ 2. **パイプライン処理**: `groupBy`、`countBy`、`take`、`first`、`join` でデータを流れるように変換
203
+ 3. **メソッドチェーン**: `.filter().take().join()` の連鎖で宣言的なデータ処理
204
+ 4. **ジェネレータ**: `function*` と `yield` による遅延評価シーケンス
205
+ 5. **構造的型付け**: 循環参照を避けるダックタイピング
206
+
207
+ 次の章では、エラーハンドリングと型安全性の観点から、TypeScript の型システムを活用したより安全なコードを学びます。