@k2works/claude-code-booster 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
  2. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
  3. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
  4. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
  5. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
  24. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
  25. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
  26. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
  27. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
  28. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
  47. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
  48. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
  49. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
  50. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
  51. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
  70. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
  71. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
  72. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
  73. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
  74. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
  93. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
  94. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
  95. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
  96. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
  97. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
  116. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
  117. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
  118. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
  119. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
  120. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
  121. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
  163. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
  164. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
  165. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
  166. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
  167. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
  168. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
  169. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
  170. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
  171. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
  172. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
  173. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
  174. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
  175. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
  176. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
  177. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
  178. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
  179. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
  180. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
  181. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
  182. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
  183. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
  184. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
  185. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
  186. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
  187. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
  188. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
  189. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
  190. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
  191. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
  192. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
  193. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
  194. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
  195. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
  196. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
  197. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
  198. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
  199. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
  200. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
  201. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
  202. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
  203. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
  204. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
  205. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
  206. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
  207. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
  208. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
  209. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
  210. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
  211. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
  212. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
  213. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
  214. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
  215. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
  216. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
  217. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
  218. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
  219. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
  220. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
  221. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
  222. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
  223. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
  224. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
  225. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
  226. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
  227. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
  228. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
  229. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
  230. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
  231. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
  232. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
  233. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
  234. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
  235. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
  236. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
  237. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
  238. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
  239. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
  240. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
  241. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
  242. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
  243. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
  244. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
  245. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
  246. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
  247. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
  248. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
  249. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
  250. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
  251. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
  252. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
  253. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
  254. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
  255. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
  256. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
  257. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
  258. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
  259. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
  260. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
  261. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
  262. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
  263. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
  264. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
  265. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
  266. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
  267. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
  268. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
  269. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
  270. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
  271. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
  272. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
  273. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
  274. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
  275. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
  276. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
  277. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
  278. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
  279. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
  280. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
  281. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
  282. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
  283. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
  284. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
  285. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
  286. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
  287. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
  288. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
  289. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
  290. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
  291. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
  292. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
  293. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
  294. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
  295. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
  296. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
  297. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
  298. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
  299. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
  300. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
  301. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
  302. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
  303. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
  304. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
  305. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
  306. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
  307. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
  308. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
  309. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
  310. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
  311. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
  312. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
  313. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
  314. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
  315. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
  316. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
  317. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
  318. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
  319. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
  320. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
  321. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
  322. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
  323. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
  324. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
  325. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
  326. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
  327. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
  328. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
  329. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
  330. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
  331. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
  332. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
  333. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
  334. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
  335. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
  336. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
  337. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
  338. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
  339. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
  340. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
  341. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
  342. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
  343. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
  344. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
  345. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
  346. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
  347. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
  348. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
  349. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
  350. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
  351. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
  352. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
  353. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
  354. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
  355. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
  356. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
  357. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
  358. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
  359. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
  360. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
  361. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
  362. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
  363. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
  364. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
  365. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
  366. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
  367. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
  368. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
  369. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
  370. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
  371. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
  372. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
  373. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
  374. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
  375. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
  376. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
  377. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
  378. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
  379. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
  380. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
  381. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
  382. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
  383. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
  384. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
  385. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
  386. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
  387. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
  388. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
  389. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
  390. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
  391. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
  392. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
  393. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
  394. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
  395. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
  396. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
  397. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
  398. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
  399. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
  400. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
  401. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
  402. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
  403. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
  404. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
  405. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
  406. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
  407. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
  408. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
  409. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
  410. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
  411. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
  412. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
  413. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
  414. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
  415. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
  416. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
  417. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
  418. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
  419. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
  420. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
  421. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
  422. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
  423. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
  424. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
  425. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
  426. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
  427. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
  428. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
  429. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
  430. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
  431. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
  432. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
  433. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
  434. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
  435. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
  436. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
  437. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
  438. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
  439. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
  440. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
  441. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
  442. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
  443. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
  444. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
  445. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
  446. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
  447. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
  448. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
  449. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
  450. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
  451. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
  452. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
  453. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
  454. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
  455. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
  456. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
  457. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
  458. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
  459. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
  460. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
  461. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
  462. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
  463. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
  464. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
  465. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
  466. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
  467. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
  468. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
  469. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
  470. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
  471. package/lib/assets/docs/article/grokkingfp/index.md +143 -0
  472. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
  473. package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
  474. package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
  475. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
  476. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
  477. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
  478. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
  479. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
  480. package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
  481. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
  482. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
  483. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
  484. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
  485. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
  486. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
  487. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
  488. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
  489. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
  490. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
  491. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
  492. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
  493. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
  494. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
  495. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
  496. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
  497. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
  498. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
  499. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
  500. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
  501. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
  502. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
  503. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
  504. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
  505. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
  506. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
  507. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
  508. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
  509. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
  510. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
  511. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
  512. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
  513. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
  514. package/lib/assets/docs/article/index.md +36 -0
  515. package/lib/assets/docs/design/index.md +39 -27
  516. package/lib/assets/docs/development/index.md +11 -1
  517. package/lib/assets/docs/index.md +33 -106
  518. package/lib/assets/docs/operation/index.md +16 -6
  519. package/lib/assets/docs/reference/index.md +5 -4
  520. package/lib/assets/docs/requirements/index.md +13 -6
  521. package/lib/assets/docs/strategy/index.md +11 -4
  522. package/lib/assets/docs/template/index.md +9 -5
  523. package/lib/assets/mkdocs.yml +29 -17
  524. package/package.json +1 -1
@@ -0,0 +1,398 @@
1
+ # 第 12 章: エラーハンドリングと型安全性
2
+
3
+ ## 12.1 はじめに
4
+
5
+ 前章までに高階関数、不変データ、パイプライン処理を学びました。最終章では、Ruby 3.x の **パターンマッチング** を使った型安全なコード、**安全なファクトリメソッド**、そして **フィボナッチ数** を題材にした **ベンチマーク** を実装します。
6
+
7
+ ## 12.2 パターンマッチング(Ruby 3.x)
8
+
9
+ ### case/in 構文
10
+
11
+ Ruby 3.0 以降、`case/in` でパターンマッチングが使えます。従来の `case/when` が値の一致を見るのに対し、`case/in` は構造の一致を見ます。
12
+
13
+ ```ruby
14
+ # 従来の case/when(値の一致)
15
+ case value
16
+ when 1 then 'one'
17
+ when 2 then 'two'
18
+ end
19
+
20
+ # Ruby 3.x の case/in(構造の一致)
21
+ case [1, 2, 3]
22
+ in [Integer => a, Integer => b, Integer => c]
23
+ puts "#{a}, #{b}, #{c}" # => "1, 2, 3"
24
+ end
25
+ ```
26
+
27
+ ### deconstruct_keys によるオブジェクトのパターンマッチング
28
+
29
+ `deconstruct_keys` を実装すると、自作クラスでもパターンマッチングが使えます。
30
+
31
+ ```ruby
32
+ class FizzBuzzValue
33
+ def deconstruct_keys(_keys)
34
+ { value: @value, number: @number }
35
+ end
36
+ end
37
+ ```
38
+
39
+ ```ruby
40
+ # 使用例
41
+ value = FizzBuzzValue.new('FizzBuzz', 15)
42
+ case value
43
+ in { value: 'FizzBuzz', number: Integer => n }
44
+ puts "FizzBuzz at #{n}" # => "FizzBuzz at 15"
45
+ in { value: 'Fizz', number: Integer => n }
46
+ puts "Fizz at #{n}"
47
+ in { value: 'Buzz', number: Integer => n }
48
+ puts "Buzz at #{n}"
49
+ else
50
+ puts "Number"
51
+ end
52
+ ```
53
+
54
+ ### テスト
55
+
56
+ ```ruby
57
+ class FizzBuzzValueTest < Minitest::Test
58
+ def test_パターンマッチングで値を取り出せる
59
+ value = FizzBuzzValue.new('Fizz', 3)
60
+ case value
61
+ in { value: 'Fizz', number: 3 }
62
+ matched = true
63
+ else
64
+ matched = false
65
+ end
66
+ assert matched
67
+ end
68
+ end
69
+ ```
70
+
71
+ ## 12.3 型安全なファクトリ
72
+
73
+ ### 問題: マジックナンバー
74
+
75
+ 現在のファクトリメソッドは数値定数でタイプを指定しています。
76
+
77
+ ```ruby
78
+ # マジックナンバーが散在する可能性
79
+ type = FizzBuzzType.create(1) # 1 が何を意味するか不明確
80
+ ```
81
+
82
+ ### 解決: FizzBuzzTypeName
83
+
84
+ 名前付き定数でタイプを指定できるようにします。
85
+
86
+ ```ruby
87
+ module FizzBuzzTypeName
88
+ STANDARD = FizzBuzzType::TYPE_01
89
+ NUMBER_ONLY = FizzBuzzType::TYPE_02
90
+ FIZZ_BUZZ_ONLY = FizzBuzzType::TYPE_03
91
+ end
92
+ ```
93
+
94
+ ```ruby
95
+ # 名前で指定(意図が明確)
96
+ type = FizzBuzzType.create(FizzBuzzTypeName::STANDARD)
97
+ ```
98
+
99
+ ### try_create: 安全なファクトリ
100
+
101
+ 未定義のタイプに対して例外ではなく `nil` を返すメソッドを追加します。
102
+
103
+ ```ruby
104
+ class FizzBuzzType
105
+ def self.try_create(type)
106
+ create(type)
107
+ rescue RuntimeError
108
+ nil
109
+ end
110
+ end
111
+ ```
112
+
113
+ ### テスト
114
+
115
+ ```ruby
116
+ class FizzBuzzTypeTest < Minitest::Test
117
+ def test_FizzBuzzTypeNameで型安全に生成できる
118
+ type = FizzBuzzType.create(FizzBuzzTypeName::STANDARD)
119
+ assert_instance_of FizzBuzzType01, type
120
+ end
121
+
122
+ def test_try_createで有効なタイプはインスタンスを返す
123
+ type = FizzBuzzType.try_create(FizzBuzzType::TYPE_01)
124
+ assert_instance_of FizzBuzzType01, type
125
+ end
126
+
127
+ def test_try_createで不明なタイプはnilを返す
128
+ type = FizzBuzzType.try_create(999)
129
+ assert_nil type
130
+ end
131
+ end
132
+ ```
133
+
134
+ ## 12.4 検索メソッド
135
+
136
+ FizzBuzzList に検索メソッドを追加しました。
137
+
138
+ ```ruby
139
+ class FizzBuzzList
140
+ def find_value(&)
141
+ @value.find(&)
142
+ end
143
+
144
+ def any_match?(&)
145
+ @value.any?(&)
146
+ end
147
+
148
+ def all_match?(&)
149
+ @value.all?(&)
150
+ end
151
+ end
152
+ ```
153
+
154
+ ### テスト
155
+
156
+ ```ruby
157
+ class FizzBuzzListTest < Minitest::Test
158
+ def test_find_valueで条件に合う最初の要素を返す
159
+ type = FizzBuzzType.create(FizzBuzzType::TYPE_01)
160
+ command = FizzBuzzListCommand.new(type, 15)
161
+ list = command.execute
162
+ result = list.find_value { |v| v.value == 'Buzz' }
163
+ assert_equal 'Buzz', result.value
164
+ assert_equal 5, result.number
165
+ end
166
+
167
+ def test_any_matchで条件に合う要素が存在するか
168
+ type = FizzBuzzType.create(FizzBuzzType::TYPE_01)
169
+ command = FizzBuzzListCommand.new(type, 15)
170
+ list = command.execute
171
+ assert list.any_match? { |v| v.value == 'FizzBuzz' }
172
+ refute list.any_match? { |v| v.value == 'Unknown' }
173
+ end
174
+
175
+ def test_all_matchで全要素が条件を満たすか
176
+ type = FizzBuzzType.create(FizzBuzzType::TYPE_02)
177
+ command = FizzBuzzListCommand.new(type, 15)
178
+ list = command.execute
179
+ assert list.all_match? { |v| v.number.positive? }
180
+ refute list.all_match? { |v| v.value == 'Fizz' }
181
+ end
182
+ end
183
+ ```
184
+
185
+ ## 12.5 フィボナッチ数とベンチマーク
186
+
187
+ ### フィボナッチ数の TDD
188
+
189
+ フィボナッチ数を 3 つのアルゴリズムで実装し、パフォーマンスを比較します。
190
+
191
+ #### Fibonacci::Command(Strategy パターン)
192
+
193
+ ```ruby
194
+ module Fibonacci
195
+ class Command
196
+ def initialize(algorithm)
197
+ @algorithm = algorithm
198
+ end
199
+
200
+ def exec(number)
201
+ @algorithm.exec(number)
202
+ end
203
+ end
204
+ end
205
+ ```
206
+
207
+ #### 再帰(メモ化あり)
208
+
209
+ ```ruby
210
+ module Fibonacci
211
+ class Recursive
212
+ def exec(number, memo = {})
213
+ return 0 if number.zero?
214
+ return 1 if number == 1
215
+
216
+ memo[number] ||= exec(number - 1, memo) + exec(number - 2, memo)
217
+ end
218
+ end
219
+ end
220
+ ```
221
+
222
+ #### ループ
223
+
224
+ ```ruby
225
+ module Fibonacci
226
+ class Loop
227
+ def exec(number)
228
+ a = 0
229
+ b = 1
230
+ c = 0
231
+ (0...number).each do |_i|
232
+ a = b
233
+ b = c
234
+ c = a + b
235
+ end
236
+ c
237
+ end
238
+ end
239
+ end
240
+ ```
241
+
242
+ #### 一般項(数学公式)
243
+
244
+ ```ruby
245
+ module Fibonacci
246
+ class GeneralTerm
247
+ def exec(number)
248
+ a = ((1 + Math.sqrt(5)) / 2)**number
249
+ b = ((1 - Math.sqrt(5)) / 2)**number
250
+ ((a - b) / Math.sqrt(5)).round
251
+ end
252
+ end
253
+ end
254
+ ```
255
+
256
+ ### テスト
257
+
258
+ ```ruby
259
+ class FibonacciTest < Minitest::Test
260
+ def setup
261
+ @recursive = Fibonacci::Command.new(Fibonacci::Recursive.new)
262
+ @loop = Fibonacci::Command.new(Fibonacci::Loop.new)
263
+ @general_term = Fibonacci::Command.new(Fibonacci::GeneralTerm.new)
264
+ end
265
+
266
+ def test_fibonacci_基本ケース
267
+ cases = [[0, 0], [1, 1], [2, 1], [3, 2], [4, 3], [5, 5]]
268
+ cases.each do |input, expected|
269
+ assert_equal expected, @recursive.exec(input)
270
+ assert_equal expected, @loop.exec(input)
271
+ assert_equal expected, @general_term.exec(input)
272
+ end
273
+ end
274
+
275
+ def test_fibonacci_再帰_大きな数
276
+ assert_equal 102_334_155, @recursive.exec(40)
277
+ end
278
+
279
+ def test_fibonacci_ループ_大きな数
280
+ assert_equal 102_334_155, @loop.exec(40)
281
+ end
282
+
283
+ def test_fibonacci_一般項_大きな数
284
+ assert_equal 102_334_155, @general_term.exec(40)
285
+ end
286
+ end
287
+ ```
288
+
289
+ ### ベンチマーク
290
+
291
+ `Minitest::Benchmark` で各アルゴリズムのパフォーマンスを測定します。
292
+
293
+ ```ruby
294
+ class FibonacciBenchmark < Minitest::Benchmark
295
+ def setup
296
+ @recursive = Fibonacci::Command.new(Fibonacci::Recursive.new)
297
+ @loop = Fibonacci::Command.new(Fibonacci::Loop.new)
298
+ @general_term = Fibonacci::Command.new(Fibonacci::GeneralTerm.new)
299
+ end
300
+
301
+ def bench_recursive
302
+ assert_performance_constant do |_n|
303
+ 1000.times { |i| @recursive.exec(i) }
304
+ end
305
+ end
306
+
307
+ def bench_loop
308
+ assert_performance_constant do |_n|
309
+ 1000.times { |i| @loop.exec(i) }
310
+ end
311
+ end
312
+
313
+ def bench_general_term
314
+ assert_performance_constant do |_n|
315
+ 1000.times { |i| @general_term.exec(i) }
316
+ end
317
+ end
318
+ end
319
+ ```
320
+
321
+ ### ベンチマーク結果
322
+
323
+ ```bash
324
+ $ bundle exec rake benchmark
325
+ bench_general_term 0.001057
326
+ bench_loop 0.162474
327
+ bench_recursive 0.449281
328
+ ```
329
+
330
+ 一般項が最速で、再帰の約 400 倍高速です。
331
+
332
+ | アルゴリズム | 計算量 | 特徴 |
333
+ |------------|--------|------|
334
+ | 再帰(メモ化) | O(n) | 理解しやすいが、メモ化が必要 |
335
+ | ループ | O(n) | メモリ効率が良い |
336
+ | 一般項 | O(1) | 数学公式で最速、大きな数では誤差の可能性 |
337
+
338
+ ## 12.6 ディレクトリ構成
339
+
340
+ ### Fibonacci モジュール
341
+
342
+ ```
343
+ lib/
344
+ ├── fizz_buzz/ (既存)
345
+ └── fibonacci/
346
+ ├── fibonacci.rb (バレルファイル)
347
+ ├── command.rb (Strategy パターン)
348
+ ├── recursive.rb (再帰アルゴリズム)
349
+ ├── loop.rb (ループアルゴリズム)
350
+ └── general_term.rb (一般項アルゴリズム)
351
+
352
+ test/
353
+ ├── fizz_buzz/ (既存 + FP メソッドのテスト追加)
354
+ └── fibonacci/
355
+ ├── fibonacci_test.rb (ユニットテスト)
356
+ └── fibonacci_benchmark.rb (ベンチマーク)
357
+ ```
358
+
359
+ ### テスト実行結果
360
+
361
+ ```bash
362
+ $ bundle exec rake test
363
+ 39 tests, 72 assertions, 0 failures, 0 errors, 0 skips
364
+ Coverage report generated for Unit Tests.
365
+ Line Coverage: 95.95% (142 / 148)
366
+ Branch Coverage: 100.0% (20 / 20)
367
+ ```
368
+
369
+ ## 12.7 各言語のエラーハンドリング比較
370
+
371
+ | 概念 | Ruby | Java | TypeScript | Python |
372
+ |------|------|------|-----------|--------|
373
+ | パターンマッチング | `case/in` + `deconstruct_keys` | `switch` (JDK 21+) | Type Guards | `match/case` (3.10+) |
374
+ | 安全なファクトリ | `try_create` → `nil` | `Optional` | `T \| undefined` | `None` |
375
+ | null 安全 | `nil` + `&.`(safe navigation) | `Optional` | Union Types | `Optional` typing |
376
+ | 列挙型 | Symbol / Module 定数 | `enum` | `enum` | `Enum` |
377
+ | ベンチマーク | `Minitest::Benchmark` | JMH | カスタム | `timeit` |
378
+
379
+ ## 12.8 第 4 部のまとめ
380
+
381
+ 第 4 部(章 10〜12)を通じて、OOP の FizzBuzz に関数型プログラミングの要素を追加しました。
382
+
383
+ | 章 | テーマ | 適用した技術 |
384
+ |---|--------|-------------|
385
+ | 10 | 高階関数と関数合成 | ブロック/Proc/Lambda、カリー化、`>>` 合成 |
386
+ | 11 | 不変データとパイプライン | `freeze`、`then` パイプライン、`tally`、Lazy |
387
+ | 12 | エラーハンドリングと型安全性 | パターンマッチング、`try_create`、ベンチマーク |
388
+
389
+ ### 全 12 章の学習体系
390
+
391
+ | 部 | テーマ | 章 |
392
+ |---|--------|---|
393
+ | 第 1 部 | TDD の基本サイクル | 章 1〜3: TODO リスト、仮実装と三角測量、明白な実装 |
394
+ | 第 2 部 | 開発環境と自動化 | 章 4〜6: バージョン管理、パッケージ管理、タスクランナー |
395
+ | 第 3 部 | オブジェクト指向設計 | 章 7〜9: ポリモーフィズム、デザインパターン、SOLID |
396
+ | 第 4 部 | 関数型プログラミング | 章 10〜12: 高階関数、パイプライン、型安全性 + ベンチマーク |
397
+
398
+ Ruby の特徴であるブロック・Proc・Lambda、Enumerable Mix-in、パターンマッチング、そしてベンチマークにより、OOP と FP のハイブリッドなプログラミングスタイルを実現しました。
@@ -0,0 +1,83 @@
1
+ # テスト駆動開発から始める Ruby 入門
2
+
3
+ ## 概要
4
+
5
+ FizzBuzz 問題を題材に、テスト駆動開発(TDD)の基本サイクルから、開発環境の整備、オブジェクト指向設計、関数型プログラミングの活用まで、Ruby の特徴を活かしながら段階的に学びます。
6
+
7
+ ## 対象読者
8
+
9
+ - Ruby の基本文法を理解しているプログラミング学習者
10
+ - TDD を体験してみたい開発者
11
+ - オブジェクト指向設計や関数型プログラミングに興味がある方
12
+
13
+ ## 前提条件
14
+
15
+ - Ruby 3.3 以降がインストールされていること
16
+ - Bundler が利用可能であること(Nix 環境推奨: `nix develop .#ruby`)
17
+
18
+ ## Ruby の特徴
19
+
20
+ | 特徴 | 説明 |
21
+ |------|------|
22
+ | 動的型付け | 変数に型宣言が不要、柔軟なプログラミングが可能 |
23
+ | オブジェクト指向 | すべてがオブジェクト、ダックタイピングによるポリモーフィズム |
24
+ | ブロック・Proc・Lambda | 高階関数をサポートする強力なクロージャ機構 |
25
+ | Enumerable | コレクション操作のための豊富なメソッド群 |
26
+ | オープンクラス | 既存クラスの拡張が可能 |
27
+ | パターンマッチング | Ruby 3.0 以降の構造的パターンマッチ |
28
+
29
+ ## 開発ツール
30
+
31
+ | ツール | 用途 |
32
+ |--------|------|
33
+ | [Minitest](https://github.com/minitest/minitest) | テスティングフレームワーク |
34
+ | [Bundler](https://bundler.io/) | パッケージ管理 |
35
+ | [RuboCop](https://rubocop.org/) | リンター・フォーマッター |
36
+ | [SimpleCov](https://github.com/simplecov-ruby/simplecov) | カバレッジ計測 |
37
+ | [Rake](https://ruby.github.io/rake/) | タスクランナー |
38
+
39
+ ## 目次
40
+
41
+ ### 第 1 部: TDD の基本サイクル
42
+
43
+ 1. [第 1 章: TODO リストと最初のテスト](01-todo-list-and-first-test.md)
44
+ 2. [第 2 章: 仮実装と三角測量](02-fake-it-and-triangulation.md)
45
+ 3. [第 3 章: 明白な実装とリファクタリング](03-obvious-implementation-and-refactoring.md)
46
+
47
+ ### 第 2 部: 開発環境と自動化
48
+
49
+ 4. [第 4 章: バージョン管理と Conventional Commits](04-version-control-and-conventional-commits.md)
50
+ 5. [第 5 章: パッケージ管理と静的解析](05-package-management-and-static-analysis.md)
51
+ 6. [第 6 章: タスクランナーと CI/CD](06-task-runner-and-ci-cd.md)
52
+
53
+ ### 第 3 部: オブジェクト指向設計
54
+
55
+ 7. [第 7 章: カプセル化とポリモーフィズム](07-encapsulation-and-polymorphism.md)
56
+ 8. [第 8 章: デザインパターンの適用](08-design-patterns.md)
57
+ 9. [第 9 章: SOLID 原則とモジュール設計](09-solid-principles-and-module-design.md)
58
+
59
+ ### 第 4 部: 関数型プログラミングへの展開
60
+
61
+ 10. [第 10 章: 高階関数と関数合成](10-higher-order-functions-and-composition.md)
62
+ 11. [第 11 章: 不変データとパイプライン処理](11-immutable-data-and-pipeline.md)
63
+ 12. [第 12 章: エラーハンドリングと型安全性](12-error-handling-and-type-safety.md)
64
+
65
+ ## 実装コード
66
+
67
+ 本記事のすべてのコード例は `apps/ruby/` に実装されています。
68
+
69
+ ```bash
70
+ # 開発環境に入る
71
+ nix develop .#ruby
72
+
73
+ # テスト実行
74
+ cd apps/ruby
75
+ bundle exec rake test
76
+ ```
77
+
78
+ ## 参考文献
79
+
80
+ - Kent Beck 著『テスト駆動開発』
81
+ - Martin Fowler 著『リファクタリング: 既存のコードを安全に改善する』
82
+ - Robert C. Martin 著『Clean Code: アジャイルソフトウェア達人の技』
83
+ - David Thomas, Andrew Hunt 著『プログラミング Ruby 改訂版』
@@ -0,0 +1,211 @@
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
+ 今回 Rust のテスティングフレームワークには **標準搭載のテストフレームワーク** を利用します。Rust のテストは Cargo と統合されており、`cargo test` コマンドで簡単に実行できます。
54
+
55
+ ### 開発環境のセットアップ
56
+
57
+ Cargo でプロジェクトを初期化し、テスト環境をセットアップします。
58
+
59
+ ```bash
60
+ # Nix 環境に入る
61
+ $ nix develop .#rust
62
+
63
+ # プロジェクトの初期化
64
+ $ cd apps
65
+ $ cargo new rust --name fizzbuzz
66
+ $ cd rust
67
+ ```
68
+
69
+ Rust のテストは `#[cfg(test)]` アトリビュートで囲んだモジュール内に書きます。テスト関数は `#[test]` アトリビュートを付けます。
70
+
71
+ ### 環境確認テスト
72
+
73
+ 環境が正しく設定されていることを確認するため、学習用テストを書きます。
74
+
75
+ ```rust
76
+ // src/lib.rs
77
+ #[cfg(test)]
78
+ mod tests {
79
+ #[test]
80
+ fn test_learning_to_string_整数を文字列へ変換できる() {
81
+ assert_eq!("42", 42.to_string());
82
+ }
83
+ }
84
+ ```
85
+
86
+ テストを実行します。
87
+
88
+ ```bash
89
+ $ cargo test
90
+ running 1 test
91
+ test tests::test_learning_to_string_整数を文字列へ変換できる ... ok
92
+
93
+ test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
94
+ ```
95
+
96
+ テストが通りました。Rust の標準テストフレームワークが正常に動作することが確認できました。`assert_eq!` マクロは Go の `if got != want` パターンや Java の `assertEquals` に相当する、Rust のアサーション手段です。
97
+
98
+ ## 1.5 仮実装
99
+
100
+ テスト環境の準備ができたので、TODO リストの最初の作業に取り掛かりましょう。
101
+
102
+ **TODO リスト**:
103
+
104
+ - [ ] 数を文字列にして返す
105
+ - **1 を渡したら文字列 "1" を返す**
106
+ - [ ] 3 の倍数のときは数の代わりに「Fizz」と返す
107
+ - [ ] 5 の倍数のときは「Buzz」と返す
108
+ - [ ] 3 と 5 両方の倍数の場合には「FizzBuzz」と返す
109
+ - [ ] 1 から 100 までの数
110
+ - [ ] プリントする
111
+
112
+ まずはアサーションを最初に書きましょう。
113
+
114
+ > アサートファースト
115
+ >
116
+ > いつアサーションを書くべきだろうか——最初に書こう。
117
+ >
118
+ > — テスト駆動開発
119
+
120
+ ### Red: 最初のテスト
121
+
122
+ FizzBuzz のテストを書きます。
123
+
124
+ ```rust
125
+ // src/lib.rs
126
+ pub fn generate(number: i32) -> String {
127
+ todo!()
128
+ }
129
+
130
+ #[cfg(test)]
131
+ mod tests {
132
+ use super::*;
133
+
134
+ #[test]
135
+ fn test_1を渡したら文字列1を返す() {
136
+ assert_eq!("1", generate(1));
137
+ }
138
+ }
139
+ ```
140
+
141
+ テストを実行します。
142
+
143
+ ```bash
144
+ $ cargo test
145
+ running 1 test
146
+ test tests::test_1を渡したら文字列1を返す ... FAILED
147
+
148
+ thread 'tests::test_1を渡したら文字列1を返す' panicked at 'not yet implemented'
149
+ ```
150
+
151
+ `not yet implemented`——まだ実装されていません。`todo!()` マクロは「ここはまだ未実装」であることを明示し、実行時にパニックを起こします。
152
+
153
+ ### Green: 仮実装
154
+
155
+ テストを通すために **仮実装** から始めます。
156
+
157
+ > 仮実装を経て本実装へ
158
+ >
159
+ > 失敗するテストを書いてから、最初に行う実装はどのようなものだろうか——ベタ書きの値を返そう。
160
+ >
161
+ > — テスト駆動開発
162
+
163
+ `generate` 関数を定義して、文字列リテラルを返します。
164
+
165
+ ```rust
166
+ pub fn generate(number: i32) -> String {
167
+ "1".to_string()
168
+ }
169
+ ```
170
+
171
+ テストを実行します。
172
+
173
+ ```bash
174
+ $ cargo test
175
+ running 1 test
176
+ test tests::test_1を渡したら文字列1を返す ... ok
177
+
178
+ test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
179
+ ```
180
+
181
+ テストが通りました。Rust では `"1"` は `&str`(文字列スライス)であり、`"1".to_string()` で `String`(所有権を持つ文字列)に変換します。Go の `return "1"` がそのまま `string` を返せるのとは異なり、Rust では `&str` と `String` の区別が重要です。
182
+
183
+ **TODO リスト**:
184
+
185
+ - [ ] 数を文字列にして返す
186
+ - [x] 1 を渡したら文字列 "1" を返す
187
+ - [ ] 3 の倍数のときは数の代わりに「Fizz」と返す
188
+ - [ ] 5 の倍数のときは「Buzz」と返す
189
+ - [ ] 3 と 5 両方の倍数の場合には「FizzBuzz」と返す
190
+ - [ ] 1 から 100 までの数
191
+ - [ ] プリントする
192
+
193
+ ここまでの作業をバージョン管理システムにコミットしておきましょう。
194
+
195
+ ```bash
196
+ $ git add .
197
+ $ git commit -m 'test: 数を文字列にして返す'
198
+ ```
199
+
200
+ ## 1.6 まとめ
201
+
202
+ この章では以下のことを学びました。
203
+
204
+ - **TODO リスト** で仕様をプログラミング対象に分解する方法
205
+ - **テストファースト** で最初にテストを書く考え方
206
+ - Rust の標準テストフレームワーク(`#[test]`、`assert_eq!`)のセットアップ
207
+ - **仮実装** でベタ書きの値を返してテストを通す手法
208
+ - **アサートファースト** でテストの終わりから書き始めるアプローチ
209
+ - Rust の `&str` と `String` の違い
210
+
211
+ 次章では、2 つ目のテストケースを追加して **三角測量** を行い、プログラムを一般化していきます。