@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,199 @@
1
+ # Scala で学ぶ関数型デザイン
2
+
3
+ ## はじめに
4
+
5
+ 本記事シリーズは、関数型プログラミングにおける設計原則とデザインパターンを Scala を使って実践的に学ぶためのガイドです。Scala のオブジェクト指向と関数型のハイブリッドな特性を活かし、従来のデザインパターンを関数型パラダイムでどのように表現し、活用できるかを探求します。
6
+
7
+ ## 記事構成
8
+
9
+ ### 第1部: 関数型プログラミングの基礎原則
10
+
11
+ 1. [不変性とデータ変換](./01-immutability-and-data-transformation.md)
12
+ - case class と不変データ構造
13
+ - データ変換パイプライン
14
+ - 副作用の分離
15
+
16
+ 2. [関数合成と高階関数](./02-function-composition.md)
17
+ - andThen と compose による関数合成
18
+ - カリー化と部分適用
19
+ - 高階関数の活用
20
+
21
+ 3. [多態性の実現方法](./03-polymorphism.md)
22
+ - sealed trait と代数的データ型
23
+ - トレイトとミックスイン
24
+ - 型クラスによる既存型の拡張
25
+
26
+ ### 第2部: 仕様とテスト
27
+
28
+ 4. [データ検証](./04-data-validation.md)
29
+ - 型によるバリデーション
30
+ - Either によるエラーハンドリング
31
+ - カスタムバリデータの作成
32
+
33
+ 5. [プロパティベーステスト](./05-property-based-testing.md)
34
+ - ScalaCheck の基本
35
+ - ジェネレータの作成
36
+ - プロパティの定義と検証
37
+
38
+ 6. [TDD と関数型プログラミング](./06-tdd-functional.md)
39
+ - ScalaTest によるテスト
40
+ - Red-Green-Refactor サイクル
41
+ - テストファーストの関数設計
42
+
43
+ ### 第3部: 構造パターン
44
+
45
+ 7. [Composite パターン](./07-composite-pattern.md)
46
+ - 再帰的なデータ構造
47
+ - ADT によるツリー構造
48
+ - fold による走査
49
+
50
+ 8. [Decorator パターン](./08-decorator-pattern.md)
51
+ - 関数合成によるデコレーション
52
+ - 高階関数でのラッピング
53
+ - 振る舞いの動的追加
54
+
55
+ 9. [Adapter パターン](./09-adapter-pattern.md)
56
+ - 関数アダプター
57
+ - プロトコル変換
58
+ - レガシーコードとの統合
59
+
60
+ ### 第4部: 振る舞いパターン
61
+
62
+ 10. [Strategy パターン](./10-strategy-pattern.md)
63
+ - 第一級関数としての戦略
64
+ - 動的な戦略切り替え
65
+ - 戦略の合成
66
+
67
+ 11. [Command パターン](./11-command-pattern.md)
68
+ - 不変コマンドオブジェクト
69
+ - コマンドの履歴と Undo
70
+ - マクロコマンド
71
+
72
+ 12. [Visitor パターン](./12-visitor-pattern.md)
73
+ - パターンマッチによる訪問
74
+ - fold ベースのビジター
75
+ - 拡張可能なビジター
76
+
77
+ ### 第5部: 生成パターン
78
+
79
+ 13. [Abstract Factory パターン](./13-abstract-factory-pattern.md)
80
+ - 関数ファクトリー
81
+ - 型クラスベースの生成
82
+ - 依存性注入
83
+
84
+ 14. [Abstract Server パターン](./14-abstract-server-pattern.md)
85
+ - トレイトによる抽象化
86
+ - 実装の差し替え
87
+ - テスタブルな設計
88
+
89
+ ### 第6部: ケーススタディ
90
+
91
+ 15. [ゴシップ好きなバスの運転手](./15-gossiping-bus-drivers.md)
92
+ - 不変状態の管理
93
+ - シミュレーションの実装
94
+ - 再帰的な処理
95
+
96
+ 16. [給与計算システム](./16-payroll-system.md)
97
+ - ドメインモデリング
98
+ - 多態的な計算
99
+ - レポート生成
100
+
101
+ 17. [レンタルビデオシステム](./17-video-rental-system.md)
102
+ - 状態遷移の管理
103
+ - イベントソーシング
104
+ - ビジネスルールの実装
105
+
106
+ 18. [並行処理システム](./18-concurrency-system.md)
107
+ - 状態マシン
108
+ - イベントバス
109
+ - AtomicReference による同期
110
+
111
+ 19. [Wa-Tor シミュレーション](./19-wator-simulation.md)
112
+ - セルオートマトン
113
+ - 不変グリッドの更新
114
+ - シミュレーションループ
115
+
116
+ ### 第7部: まとめと応用
117
+
118
+ 20. [パターン間の相互作用](./20-pattern-interactions.md)
119
+ - Composite + Decorator
120
+ - Command + Observer
121
+ - パターンの組み合わせ
122
+
123
+ 21. [ベストプラクティス](./21-best-practices.md)
124
+ - データ中心設計
125
+ - IO モナド
126
+ - 関数デコレーター
127
+ - テスタブルな設計
128
+
129
+ 22. [OO から FP への移行](./22-oo-to-fp-migration.md)
130
+ - 移行戦略(Strangler Fig、アダプター)
131
+ - イベントソーシング
132
+ - 段階的な関数抽出
133
+ - ADT による多態性
134
+
135
+ ---
136
+
137
+ ## 本シリーズの特徴
138
+
139
+ ### Scala の特性を活かした実装
140
+
141
+ Scala 3 の新機能(enum、given/using、拡張メソッドなど)を活用し、モダンな関数型プログラミングを学びます。
142
+
143
+ ### 実践重視
144
+
145
+ すべてのパターンは ScalaTest による実際に動作するテストコードを含みます。理論だけでなく、実装を通じて理解を深めることを重視しています。
146
+
147
+ ### 段階的な学習
148
+
149
+ 基礎から応用へと段階的に内容が進行します。各章は独立して読むこともできますが、順番に読むことでより深い理解が得られます。
150
+
151
+ ---
152
+
153
+ ## 対象読者
154
+
155
+ - 関数型プログラミングに興味がある Scala 開発者
156
+ - Scala を学習中の開発者
157
+ - オブジェクト指向デザインパターンの知識があり、関数型での表現を学びたい開発者
158
+ - Clojure 版と比較して学習したい開発者
159
+
160
+ ---
161
+
162
+ ## 前提知識
163
+
164
+ - プログラミングの基礎知識
165
+ - Scala の基本的な文法(case class、trait、パターンマッチングなど)
166
+ - デザインパターンの基本概念(推奨)
167
+
168
+ ---
169
+
170
+ ## 開発環境
171
+
172
+ 本シリーズのコードは以下の環境で動作確認しています:
173
+
174
+ - Scala 3.3.1
175
+ - sbt 1.9.7
176
+ - ScalaTest 3.2.17
177
+ - Nix による環境管理
178
+
179
+ ### 環境構築
180
+
181
+ ```bash
182
+ # Nix を使用した開発環境の起動
183
+ nix develop .#scala
184
+
185
+ # テストの実行
186
+ cd apps/scala/part1
187
+ sbt test
188
+ ```
189
+
190
+ ---
191
+
192
+ ## 参考書籍
193
+
194
+ 本シリーズは以下の書籍の内容を参考にしています:
195
+
196
+ - 「Functional Design: Principles, Patterns, and Practices」Robert C. Martin
197
+ - 「Functional Programming in Scala」Paul Chiusano, Rúnar Bjarnason
198
+ - 「Programming in Scala」Martin Odersky, Lex Spoon, Bill Venners
199
+ - 「Scala with Cats」Noel Welsh, Dave Gurnell
@@ -0,0 +1,166 @@
1
+ # 第 1 章: TODO リストと最初のテスト
2
+
3
+ ## 1.1 はじめに
4
+
5
+ プログラムを作成するにあたって、まず何をすればよいでしょうか?私たちは、仕様を確認して **TODO リスト** を作るところから始めます。
6
+
7
+ > TODO リスト
8
+ >
9
+ > 何をテストすべきだろうか——着手する前に、必要になりそうなテストをリストに書き出しておこう。
10
+ >
11
+ > — テスト駆動開発
12
+
13
+ ## 1.2 仕様の確認
14
+
15
+ 今回取り組む FizzBuzz 問題の仕様は以下の通りです。
16
+
17
+ ```
18
+ 1 から 100 までの数をプリントするプログラムを書け。
19
+ ただし 3 の倍数のときは数の代わりに「Fizz」と、5 の倍数のときは「Buzz」とプリントし、
20
+ 3 と 5 両方の倍数の場合には「FizzBuzz」とプリントすること。
21
+ ```
22
+
23
+ この仕様をそのままプログラムに落とし込むには少しサイズが大きいですね。最初の作業は仕様を **TODO リスト** に分解する作業から着手しましょう。
24
+
25
+ ## 1.3 TODO リストの作成
26
+
27
+ 仕様を分解して TODO リストを作成します。
28
+
29
+ **TODO リスト**:
30
+
31
+ - [ ] 数を文字列にして返す
32
+ - [ ] 1 を渡したら文字列 "1" を返す
33
+ - [ ] 3 の倍数のときは数の代わりに「Fizz」と返す
34
+ - [ ] 5 の倍数のときは「Buzz」と返す
35
+ - [ ] 3 と 5 両方の倍数の場合には「FizzBuzz」と返す
36
+ - [ ] 1 から 100 までの数
37
+ - [ ] プリントする
38
+
39
+ まず「1 を渡したら文字列 "1" を返す」という、最も小さなタスクから取り掛かります。
40
+
41
+ ## 1.4 テスティングフレームワークの導入
42
+
43
+ ### テストファースト
44
+
45
+ 最初にプログラムする対象を決めたので、早速プロダクトコードを実装……ではなく **テストファースト** で作業を進めましょう。
46
+
47
+ > テストファースト
48
+ >
49
+ > いつテストを書くべきだろうか——それはテスト対象のコードを書く前だ。
50
+ >
51
+ > — テスト駆動開発
52
+
53
+ 今回 Clojure のテスティングフレームワークには標準ライブラリの **clojure.test** を利用します。`deftest`、`testing`、`is` マクロを使ってテストを記述します。
54
+
55
+ ### 開発環境のセットアップ
56
+
57
+ Leiningen でプロジェクトをセットアップします。
58
+
59
+ ```bash
60
+ # Nix 環境に入る
61
+ $ nix develop .#clojure
62
+
63
+ # プロジェクトディレクトリに移動
64
+ $ cd apps/clojure
65
+ ```
66
+
67
+ Clojure のテストは `test/` ディレクトリ配下に、プロダクトコードと対応する名前空間で配置します。
68
+
69
+ ### 環境確認テスト
70
+
71
+ 環境が正しく設定されていることを確認するため、学習用テストを書きます。
72
+
73
+ ```clojure
74
+ ;; test/fizzbuzz/core_test.clj
75
+ (ns fizzbuzz.core-test
76
+ (:require [clojure.test :refer :all]
77
+ [fizzbuzz.core :refer :all]))
78
+
79
+ (deftest greeting-test
80
+ (testing "挨拶機能"
81
+ (is (= "hello world" (greeting)))))
82
+ ```
83
+
84
+ プロダクトコードを作成します。
85
+
86
+ ```clojure
87
+ ;; src/fizzbuzz/core.clj
88
+ (ns fizzbuzz.core)
89
+
90
+ (defn greeting []
91
+ "hello world")
92
+ ```
93
+
94
+ テストを実行します。
95
+
96
+ ```bash
97
+ $ lein test
98
+
99
+ lein test fizzbuzz.core-test
100
+
101
+ Ran 1 tests containing 1 assertions.
102
+ 0 failures, 0 errors.
103
+ ```
104
+
105
+ テスト環境が正しく動作することを確認できました。
106
+
107
+ ## 1.5 最初のテスト
108
+
109
+ では、FizzBuzz の最初のテストを作成しましょう。「1 を渡したら文字列 "1" を返す」テストです。
110
+
111
+ ```clojure
112
+ ;; test/fizzbuzz/core_test.clj
113
+ (ns fizzbuzz.core-test
114
+ (:require [clojure.test :refer :all]
115
+ [fizzbuzz.core :refer :all]))
116
+
117
+ (deftest fizzbuzz-test
118
+ (testing "数を文字列にして返す"
119
+ (testing "1 を渡したら文字列 \"1\" を返す"
120
+ (is (= "1" (fizzbuzz 1))))))
121
+ ```
122
+
123
+ プロダクトコードに空の実装を追加します。
124
+
125
+ ```clojure
126
+ ;; src/fizzbuzz/core.clj
127
+ (ns fizzbuzz.core)
128
+
129
+ (defn fizzbuzz [n]
130
+ nil)
131
+ ```
132
+
133
+ テストを実行すると失敗します。
134
+
135
+ ```bash
136
+ $ lein test
137
+
138
+ FAIL in (fizzbuzz-test) (core_test.clj:7)
139
+ 数を文字列にして返す 1 を渡したら文字列 "1" を返す
140
+ expected: (= "1" (fizzbuzz 1))
141
+ actual: (not (= "1" nil))
142
+
143
+ Ran 1 tests containing 1 assertions.
144
+ 1 failures, 0 errors.
145
+ ```
146
+
147
+ **RED** の状態です。テストが失敗していることを確認しました。
148
+
149
+ ## 1.6 まとめ
150
+
151
+ この章では以下のことを学びました。
152
+
153
+ - **TODO リスト** を作成して仕様を小さなタスクに分解する方法
154
+ - **clojure.test** を使ったテストの書き方(`deftest`、`testing`、`is`)
155
+ - **テストファースト** のアプローチで最初に失敗するテストを書くこと
156
+ - Leiningen プロジェクトの基本構造
157
+
158
+ **TODO リスト**:
159
+
160
+ - [ ] 数を文字列にして返す
161
+ - [x] 1 を渡したら文字列 "1" を返す ← RED
162
+ - [ ] 3 の倍数のときは数の代わりに「Fizz」と返す
163
+ - [ ] 5 の倍数のときは「Buzz」と返す
164
+ - [ ] 3 と 5 両方の倍数の場合には「FizzBuzz」と返す
165
+ - [ ] 1 から 100 までの数
166
+ - [ ] プリントする
@@ -0,0 +1,162 @@
1
+ # 第 2 章: 仮実装と三角測量
2
+
3
+ ## 2.1 はじめに
4
+
5
+ 前章で最初の失敗するテストを書きました。この章では **仮実装** と **三角測量** というテクニックを使って、テストを通すための最小限の実装を進めていきます。
6
+
7
+ ## 2.2 仮実装(Fake It)
8
+
9
+ ### GREEN にする
10
+
11
+ **仮実装** とは、テストを通すために最も簡単な実装を行うことです。
12
+
13
+ > ベタ書きの答えを書け
14
+ >
15
+ > すばやくグリーンにするにはどうすればよいだろうか——ベタ書きの答えを返すのだ。
16
+ >
17
+ > — テスト駆動開発
18
+
19
+ 現在失敗しているテストをグリーンにするには、単に `"1"` を返せばよいですね。
20
+
21
+ ```clojure
22
+ ;; src/fizzbuzz/core.clj
23
+ (ns fizzbuzz.core)
24
+
25
+ (defn fizzbuzz [n]
26
+ "1")
27
+ ```
28
+
29
+ テストを実行します。
30
+
31
+ ```bash
32
+ $ lein test
33
+
34
+ Ran 1 tests containing 1 assertions.
35
+ 0 failures, 0 errors.
36
+ ```
37
+
38
+ テストが通りました。**GREEN** です。
39
+
40
+ ### REFACTOR
41
+
42
+ リファクタリングの必要があるかコードを確認しましょう。ベタ書きの実装ですが、次のテストで通用しなくなるでしょう。今の段階ではリファクタリングは不要です。
43
+
44
+ ## 2.3 三角測量
45
+
46
+ 次のテストを追加して、実装を一般化(抽象化)していきます。
47
+
48
+ > 三角測量
49
+ >
50
+ > どうやって抽象化を進めればよいだろうか——2 つ以上の例があるときのみ抽象化を行うのだ。
51
+ >
52
+ > — テスト駆動開発
53
+
54
+ ```clojure
55
+ ;; test/fizzbuzz/core_test.clj
56
+ (deftest fizzbuzz-test
57
+ (testing "数を文字列にして返す"
58
+ (testing "1 を渡したら文字列 \"1\" を返す"
59
+ (is (= "1" (fizzbuzz 1))))
60
+ (testing "2 を渡したら文字列 \"2\" を返す"
61
+ (is (= "2" (fizzbuzz 2))))))
62
+ ```
63
+
64
+ テストを実行すると失敗します。
65
+
66
+ ```bash
67
+ $ lein test
68
+
69
+ FAIL in (fizzbuzz-test) (core_test.clj:9)
70
+ 数を文字列にして返す 2 を渡したら文字列 "2" を返す
71
+ expected: (= "2" (fizzbuzz 2))
72
+ actual: (not (= "2" "1"))
73
+ ```
74
+
75
+ 2 つ以上の例があるので抽象化しましょう。`str` 関数を使って数値を文字列に変換します。
76
+
77
+ ```clojure
78
+ ;; src/fizzbuzz/core.clj
79
+ (ns fizzbuzz.core)
80
+
81
+ (defn fizzbuzz [n]
82
+ (str n))
83
+ ```
84
+
85
+ テストを実行します。
86
+
87
+ ```bash
88
+ $ lein test
89
+
90
+ Ran 1 tests containing 2 assertions.
91
+ 0 failures, 0 errors.
92
+ ```
93
+
94
+ テストが通りました。
95
+
96
+ ## 2.4 3 の倍数のテスト
97
+
98
+ 次は「3 の倍数のときは数の代わりに Fizz と返す」を実装しましょう。
99
+
100
+ ```clojure
101
+ (deftest fizzbuzz-test
102
+ (testing "数を文字列にして返す"
103
+ (testing "1 を渡したら文字列 \"1\" を返す"
104
+ (is (= "1" (fizzbuzz 1))))
105
+ (testing "2 を渡したら文字列 \"2\" を返す"
106
+ (is (= "2" (fizzbuzz 2)))))
107
+
108
+ (testing "3 の倍数のときは数の代わりに「Fizz」と返す"
109
+ (testing "3 を渡したら文字列 \"Fizz\" を返す"
110
+ (is (= "Fizz" (fizzbuzz 3))))))
111
+ ```
112
+
113
+ テスト実行 → RED。Clojure の `cond` を使って条件分岐を追加します。
114
+
115
+ ```clojure
116
+ (defn fizzbuzz [n]
117
+ (cond
118
+ (zero? (mod n 3)) "Fizz"
119
+ :else (str n)))
120
+ ```
121
+
122
+ テスト実行 → GREEN。
123
+
124
+ ## 2.5 5 の倍数のテスト
125
+
126
+ ```clojure
127
+ (testing "5 の倍数のときは「Buzz」と返す"
128
+ (testing "5 を渡したら文字列 \"Buzz\" を返す"
129
+ (is (= "Buzz" (fizzbuzz 5)))))
130
+ ```
131
+
132
+ テスト実行 → RED。条件を追加します。
133
+
134
+ ```clojure
135
+ (defn fizzbuzz [n]
136
+ (cond
137
+ (zero? (mod n 3)) "Fizz"
138
+ (zero? (mod n 5)) "Buzz"
139
+ :else (str n)))
140
+ ```
141
+
142
+ テスト実行 → GREEN。
143
+
144
+ ## 2.6 まとめ
145
+
146
+ この章では以下のことを学びました。
147
+
148
+ - **仮実装(Fake It)**: テストを通す最小限の実装(ベタ書き)
149
+ - **三角測量**: 2 つ以上のテストケースから一般化を導く
150
+ - Clojure の `cond` による条件分岐
151
+ - `zero?` と `mod` による倍数判定
152
+
153
+ **TODO リスト**:
154
+
155
+ - [x] 数を文字列にして返す
156
+ - [x] 1 を渡したら文字列 "1" を返す
157
+ - [x] 2 を渡したら文字列 "2" を返す
158
+ - [x] 3 の倍数のときは数の代わりに「Fizz」と返す
159
+ - [x] 5 の倍数のときは「Buzz」と返す
160
+ - [ ] 3 と 5 両方の倍数の場合には「FizzBuzz」と返す
161
+ - [ ] 1 から 100 までの数
162
+ - [ ] プリントする
@@ -0,0 +1,135 @@
1
+ # 第 3 章: 明白な実装とリファクタリング
2
+
3
+ ## 3.1 はじめに
4
+
5
+ 前章で三角測量による実装を学びました。この章では **明白な実装** で残りの FizzBuzz ロジックを完成させ、**リファクタリング** によってコードを整理します。
6
+
7
+ ## 3.2 3 と 5 両方の倍数
8
+
9
+ ### RED
10
+
11
+ ```clojure
12
+ (testing "3 と 5 両方の倍数の場合には「FizzBuzz」と返す"
13
+ (testing "15 を渡したら文字列 \"FizzBuzz\" を返す"
14
+ (is (= "FizzBuzz" (fizzbuzz 15)))))
15
+ ```
16
+
17
+ テスト実行 → RED。15 は 3 の倍数でもあるため "Fizz" が返されます。
18
+
19
+ ### GREEN
20
+
21
+ 3 と 5 両方の倍数の条件を最初に配置します。Clojure の `and` で複合条件を表現します。
22
+
23
+ ```clojure
24
+ (defn fizzbuzz [n]
25
+ (cond
26
+ (and (zero? (mod n 3)) (zero? (mod n 5))) "FizzBuzz"
27
+ (zero? (mod n 3)) "Fizz"
28
+ (zero? (mod n 5)) "Buzz"
29
+ :else (str n)))
30
+ ```
31
+
32
+ テスト実行 → GREEN。
33
+
34
+ ### REFACTOR
35
+
36
+ > 明白な実装
37
+ >
38
+ > すばやくグリーンにするにはどうすればよいだろうか——そのまま実装するのだ。
39
+ >
40
+ > — テスト駆動開発
41
+
42
+ 現在のコードは明快で読みやすいですが、`(zero? (mod n 3))` という条件が重複しています。Clojure ではヘルパー関数を使って条件を抽出できます。
43
+
44
+ ```clojure
45
+ (defn- divisible-by?
46
+ "n が d で割り切れるかどうかを判定する"
47
+ [n d]
48
+ (zero? (mod n d)))
49
+
50
+ (defn fizzbuzz [n]
51
+ (cond
52
+ (and (divisible-by? n 3) (divisible-by? n 5)) "FizzBuzz"
53
+ (divisible-by? n 3) "Fizz"
54
+ (divisible-by? n 5) "Buzz"
55
+ :else (str n)))
56
+ ```
57
+
58
+ テスト実行 → GREEN。リファクタリング後もテストが通ることを確認しました。
59
+
60
+ ## 3.3 1 から 100 までのリスト
61
+
62
+ 1 から 100 までの FizzBuzz リストを生成する機能を追加します。
63
+
64
+ ### RED
65
+
66
+ ```clojure
67
+ (deftest fizzbuzz-list-test
68
+ (testing "1 から 100 までの FizzBuzz リストを生成する"
69
+ (let [result (fizzbuzz-list 1 100)]
70
+ (is (= 100 (count result)))
71
+ (is (= "1" (first result)))
72
+ (is (= "Buzz" (nth result 99))))))
73
+ ```
74
+
75
+ ### GREEN
76
+
77
+ Clojure の `map` と `range` を使って実装します。
78
+
79
+ ```clojure
80
+ (defn fizzbuzz-list [start end]
81
+ (mapv fizzbuzz (range start (inc end))))
82
+ ```
83
+
84
+ `mapv` はベクタ(永続配列)を返す `map` のバリアントです。テスト実行 → GREEN。
85
+
86
+ ## 3.4 プリント機能
87
+
88
+ ```clojure
89
+ (defn print-fizzbuzz [start end]
90
+ (doseq [item (fizzbuzz-list start end)]
91
+ (println item)))
92
+
93
+ (defn -main [& _args]
94
+ (print-fizzbuzz 1 100))
95
+ ```
96
+
97
+ `doseq` は副作用を伴うシーケンス処理に使います。`-main` 関数はエントリーポイントです。
98
+
99
+ ## 3.5 スレッディングマクロ
100
+
101
+ Clojure には **スレッディングマクロ**(`->` と `->>`)があります。これにより、データの変換パイプラインを読みやすく記述できます。
102
+
103
+ ```clojure
104
+ ;; 通常の書き方
105
+ (println (first (mapv fizzbuzz (range 1 101))))
106
+
107
+ ;; ->> マクロを使った書き方
108
+ (->> (range 1 101)
109
+ (mapv fizzbuzz)
110
+ first
111
+ println)
112
+ ```
113
+
114
+ `->>` マクロは、前の式の結果を次の式の **最後の引数** に挿入します。パイプラインのように左から右へデータが流れるイメージで読めます。
115
+
116
+ ## 3.6 まとめ
117
+
118
+ この章では以下のことを学びました。
119
+
120
+ - **明白な実装**: 自明な場合はそのまま実装する
121
+ - **リファクタリング**: `defn-` によるプライベート関数の抽出
122
+ - `mapv` と `range` によるリスト生成
123
+ - `doseq` による副作用を伴うシーケンス処理
124
+ - `->>` スレッディングマクロによるパイプライン処理
125
+
126
+ **TODO リスト**:
127
+
128
+ - [x] 数を文字列にして返す
129
+ - [x] 3 の倍数のときは数の代わりに「Fizz」と返す
130
+ - [x] 5 の倍数のときは「Buzz」と返す
131
+ - [x] 3 と 5 両方の倍数の場合には「FizzBuzz」と返す
132
+ - [x] 1 から 100 までの数
133
+ - [x] プリントする
134
+
135
+ 第 1 部の FizzBuzz 基本実装が完成しました。第 2 部では開発環境と自動化について学びます。