@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,938 @@
1
+ # Part II: 関数型スタイルのプログラミング
2
+
3
+ 本章では、関数型プログラミングの核心となるテクニックを学びます。イミュータブルなデータ操作、高階関数、そして `flat_map` による複雑なデータ変換を習得します。
4
+
5
+ ---
6
+
7
+ ## 第3章: イミュータブルなデータ操作
8
+
9
+ ### 3.1 イミュータブルとは
10
+
11
+ イミュータブル(不変)とは、一度作成されたデータが変更されないことを意味します。データを「変更」する代わりに、新しいデータを「作成」します。
12
+
13
+ ```plantuml
14
+ @startuml
15
+ !theme plain
16
+
17
+ rectangle "ミュータブル(可変)" as mut {
18
+ card "list = ['A', 'B']" as m1
19
+ card "list << 'C'" as m2
20
+ card "list = ['A', 'B', 'C']" as m3
21
+ m1 --> m2 : 変更
22
+ m2 --> m3 : 同じ配列が変わる
23
+ }
24
+
25
+ rectangle "イミュータブル(不変)" as immut {
26
+ card "list1 = ['A', 'B']" as i1
27
+ card "list2 = list1 + ['C']" as i2
28
+ card "list1 = ['A', 'B']\nlist2 = ['A', 'B', 'C']" as i3
29
+ i1 --> i2 : 新規作成
30
+ i2 --> i3 : 両方が存在
31
+ }
32
+
33
+ @enduml
34
+ ```
35
+
36
+ **ソースファイル**: `app/ruby/src/ch03_immutable_values.rb`
37
+
38
+ ### 3.2 Array の基本操作
39
+
40
+ Ruby では `+` 演算子を使って新しい配列を作成します。
41
+
42
+ #### appended - 要素の追加
43
+
44
+ ```ruby
45
+ def self.appended(list, element)
46
+ list + [element]
47
+ end
48
+
49
+ apple_book = %w[Apple Book]
50
+ apple_book_mango = appended(apple_book, 'Mango')
51
+
52
+ # 元のリストは変わらない
53
+ apple_book.size # => 2
54
+ apple_book_mango.size # => 3
55
+ apple_book_mango # => ["Apple", "Book", "Mango"]
56
+ ```
57
+
58
+ #### take / drop / slice - 配列の切り出し
59
+
60
+ ```ruby
61
+ def self.first_two(list)
62
+ list.take(2)
63
+ end
64
+
65
+ def self.last_two(list)
66
+ list.last(2)
67
+ end
68
+
69
+ def self.slice(list, start_idx, end_idx)
70
+ list[start_idx...end_idx] || []
71
+ end
72
+
73
+ first_two(%w[a b c]) # => ["a", "b"]
74
+ last_two(%w[a b c]) # => ["b", "c"]
75
+ slice(%w[a b c d], 1, 3) # => ["b", "c"]
76
+ ```
77
+
78
+ ```plantuml
79
+ @startuml
80
+ !theme plain
81
+
82
+ rectangle "slice(start, end)" {
83
+ card "['a', 'b', 'c', 'd']" as orig
84
+ card "[1...3]" as op
85
+ card "['b', 'c']" as result
86
+
87
+ orig --> op
88
+ op --> result
89
+ }
90
+
91
+ note bottom of result
92
+ インデックス 1 から 3 の手前まで
93
+ (end は含まない)
94
+ end note
95
+
96
+ @enduml
97
+ ```
98
+
99
+ ### 3.3 リストの変換例
100
+
101
+ ```ruby
102
+ # 最初の2要素を末尾に移動
103
+ def self.moved_first_two_to_end(list)
104
+ return list if list.size <= 2
105
+
106
+ first_two = list.take(2)
107
+ rest = list.drop(2)
108
+ rest + first_two
109
+ end
110
+
111
+ moved_first_two_to_end(%w[a b c]) # => ["c", "a", "b"]
112
+
113
+ # 最後の要素の前に挿入
114
+ def self.inserted_before_last(list, element)
115
+ return [element] if list.empty?
116
+
117
+ without_last = list[0...-1]
118
+ last_elem = list[-1..]
119
+ without_last + [element] + last_elem
120
+ end
121
+
122
+ inserted_before_last(%w[a b], 'c') # => ["a", "c", "b"]
123
+ ```
124
+
125
+ ### 3.4 旅程の再計画
126
+
127
+ 旅行の計画変更をイミュータブルに行う例です。
128
+
129
+ ```ruby
130
+ def self.replan(plan, new_city, before_city)
131
+ index = plan.index(before_city)
132
+ return plan if index.nil?
133
+
134
+ before = plan.take(index)
135
+ after = plan.drop(index)
136
+ before + [new_city] + after
137
+ end
138
+
139
+ plan_a = %w[Paris Berlin Kraków]
140
+ plan_b = replan(plan_a, 'Vienna', 'Kraków')
141
+
142
+ plan_b # => ["Paris", "Berlin", "Vienna", "Kraków"]
143
+ plan_a # => ["Paris", "Berlin", "Kraków"] # 元の計画は変わらない!
144
+ ```
145
+
146
+ ```plantuml
147
+ @startuml
148
+ !theme plain
149
+
150
+ rectangle "旅程の再計画" {
151
+ card "Plan A:\nParis → Berlin → Kraków" as planA
152
+ card "replan(plan_a, 'Vienna', 'Kraków')" as op
153
+ card "Plan B:\nParis → Berlin → Vienna → Kraków" as planB
154
+
155
+ planA --> op
156
+ op --> planB
157
+ }
158
+
159
+ note right of planA
160
+ Plan A は変更されない
161
+ (イミュータブル)
162
+ end note
163
+
164
+ @enduml
165
+ ```
166
+
167
+ ### 3.5 名前の省略
168
+
169
+ ```ruby
170
+ def self.abbreviate(name)
171
+ separator_idx = name.index(' ')
172
+ return name if separator_idx.nil?
173
+
174
+ initial = name[0]
175
+ last_name = name[(separator_idx + 1)..]
176
+ "#{initial}. #{last_name}"
177
+ end
178
+
179
+ abbreviate('Alonzo Church') # => "A. Church"
180
+ abbreviate('A. Church') # => "A. Church"
181
+ ```
182
+
183
+ ---
184
+
185
+ ## 第4章: 関数を値として扱う
186
+
187
+ ### 4.1 高階関数とは
188
+
189
+ 高階関数(Higher-Order Function)とは、以下のいずれかを満たす関数です:
190
+
191
+ 1. 関数を引数として受け取る
192
+ 2. 関数を戻り値として返す
193
+
194
+ **ソースファイル**: `app/ruby/src/ch04_functions_as_values.rb`
195
+
196
+ ```plantuml
197
+ @startuml
198
+ !theme plain
199
+
200
+ rectangle "高階関数" {
201
+ rectangle "関数を引数に取る" as arg {
202
+ card "sort_by { |x| ... }" as sortBy
203
+ card "map { |x| ... }" as map
204
+ card "select { |x| ... }" as filter
205
+ }
206
+
207
+ rectangle "関数を返す" as ret {
208
+ card "larger_than_fn(n)" as larger
209
+ card "divisible_by(n)" as divisible
210
+ }
211
+ }
212
+
213
+ @enduml
214
+ ```
215
+
216
+ ### 4.2 関数を引数として渡す
217
+
218
+ #### sort_by - ソート基準を関数で指定
219
+
220
+ ```ruby
221
+ def self.score(word)
222
+ word.gsub(/a/i, '').length
223
+ end
224
+
225
+ words = %w[rust java]
226
+ sorted_words = words.sort_by { |w| score(w) }
227
+
228
+ sorted_words # => ["java", "rust"]
229
+ # java: 2文字 (j, v), rust: 4文字 (r, u, s, t)
230
+ ```
231
+
232
+ ```plantuml
233
+ @startuml
234
+ !theme plain
235
+
236
+ rectangle "sort_by の動作" {
237
+ card "['rust', 'java']" as input
238
+ card "score('rust') = 4\nscore('java') = 2" as scores
239
+ card "['java', 'rust']" as output
240
+
241
+ input --> scores : score関数を適用
242
+ scores --> output : スコア順にソート
243
+ }
244
+
245
+ @enduml
246
+ ```
247
+
248
+ #### map - 各要素を変換
249
+
250
+ ```ruby
251
+ def self.lengths(strings)
252
+ strings.map(&:length)
253
+ end
254
+
255
+ lengths(%w[scala rust ada]) # => [5, 4, 3]
256
+
257
+ def self.double_all(numbers)
258
+ numbers.map { |n| n * 2 }
259
+ end
260
+
261
+ double_all([5, 1, 2, 4, 0]) # => [10, 2, 4, 8, 0]
262
+ ```
263
+
264
+ #### select / filter - 条件に合う要素を抽出
265
+
266
+ ```ruby
267
+ def self.odds(numbers)
268
+ numbers.select(&:odd?)
269
+ end
270
+
271
+ odds([5, 1, 2, 4, 0]) # => [5, 1]
272
+
273
+ def self.larger_than(numbers, n)
274
+ numbers.select { |i| i > n }
275
+ end
276
+
277
+ larger_than([5, 1, 2, 4, 0], 4) # => [5]
278
+ ```
279
+
280
+ #### reduce / fold - 畳み込み
281
+
282
+ ```ruby
283
+ def self.sum(numbers)
284
+ numbers.reduce(0, :+)
285
+ end
286
+
287
+ sum([5, 1, 2, 4, 100]) # => 112
288
+
289
+ def self.maximum(numbers)
290
+ return nil if numbers.empty?
291
+ numbers.reduce { |max, n| n > max ? n : max }
292
+ end
293
+
294
+ maximum([5, 1, 2, 4, 15]) # => 15
295
+ ```
296
+
297
+ ```plantuml
298
+ @startuml
299
+ !theme plain
300
+
301
+ rectangle "reduce の動作" {
302
+ card "初期値: 0" as init
303
+ card "0 + 5 = 5" as s1
304
+ card "5 + 1 = 6" as s2
305
+ card "6 + 2 = 8" as s3
306
+ card "8 + 4 = 12" as s4
307
+ card "12 + 100 = 112" as s5
308
+
309
+ init --> s1
310
+ s1 --> s2
311
+ s2 --> s3
312
+ s3 --> s4
313
+ s4 --> s5
314
+ }
315
+
316
+ @enduml
317
+ ```
318
+
319
+ ### 4.3 Struct(case class 相当)
320
+
321
+ ```ruby
322
+ # Struct を使った不変データ型
323
+ ProgrammingLanguage = Struct.new(:name, :year, keyword_init: true) do
324
+ def young?(threshold_year)
325
+ year > threshold_year
326
+ end
327
+ end
328
+
329
+ java = ProgrammingLanguage.new(name: 'Java', year: 1995)
330
+ scala = ProgrammingLanguage.new(name: 'Scala', year: 2004)
331
+
332
+ languages = [java, scala]
333
+
334
+ # フィールドにアクセス
335
+ names = languages.map(&:name)
336
+ names # => ["Java", "Scala"]
337
+
338
+ # 条件でフィルタ
339
+ young = languages.select { |lang| lang.year > 2000 }
340
+ young.map(&:name) # => ["Scala"]
341
+ ```
342
+
343
+ ### 4.4 関数を返す関数
344
+
345
+ ```ruby
346
+ def self.larger_than_fn(n)
347
+ ->(i) { i > n }
348
+ end
349
+
350
+ large = [5, 1, 2, 4, 0].select(&larger_than_fn(4))
351
+ large # => [5]
352
+
353
+ medium = [5, 1, 2, 4, 0].select(&larger_than_fn(1))
354
+ medium # => [5, 2, 4]
355
+ ```
356
+
357
+ ```plantuml
358
+ @startuml
359
+ !theme plain
360
+
361
+ rectangle "関数を返す関数" {
362
+ card "larger_than_fn(4)" as call
363
+ card "->(i) { i > 4 }" as fn
364
+ card "select に渡す" as filter
365
+
366
+ call --> fn : Lambda を生成
367
+ fn --> filter : 生成された関数を使用
368
+ }
369
+
370
+ note bottom
371
+ larger_than_fn(4) は
372
+ 「4より大きいか判定する Lambda」を返す
373
+ end note
374
+
375
+ @enduml
376
+ ```
377
+
378
+ ### 4.5 カリー化
379
+
380
+ カリー化(Currying)は、複数の引数を取る関数を、引数を1つずつ取る関数のチェーンに変換する技法です。
381
+
382
+ ```ruby
383
+ # カリー化された関数
384
+ def self.larger_than_curried
385
+ ->(n) { ->(i) { i > n } }
386
+ end
387
+
388
+ # 使用例
389
+ larger_than = larger_than_curried
390
+ larger_than_5 = larger_than.call(5)
391
+ larger_than_5.call(10) # => true
392
+ larger_than_5.call(3) # => false
393
+
394
+ # proc の curry メソッドも使える
395
+ add = ->(a, b) { a + b }
396
+ add_curried = add.curry
397
+ add_5 = add_curried.call(5)
398
+ add_5.call(3) # => 8
399
+ ```
400
+
401
+ ```plantuml
402
+ @startuml
403
+ !theme plain
404
+
405
+ rectangle "カリー化" {
406
+ rectangle "通常の関数" as normal {
407
+ card "f(a, b, c)" as n1
408
+ }
409
+
410
+ rectangle "カリー化された関数" as curried {
411
+ card "f(a)(b)(c)" as c1
412
+ }
413
+
414
+ normal --> curried : カリー化
415
+ }
416
+
417
+ note bottom of curried
418
+ 部分適用が可能
419
+ f(a) → 関数を返す
420
+ f(a)(b) → 関数を返す
421
+ f(a)(b)(c) → 結果を返す
422
+ end note
423
+
424
+ @enduml
425
+ ```
426
+
427
+ ### 4.6 ワードスコアリングの例
428
+
429
+ 複数のスコアリングロジックを組み合わせる例です。
430
+
431
+ ```ruby
432
+ def self.score(word)
433
+ word.gsub(/a/i, '').length
434
+ end
435
+
436
+ def self.bonus(word)
437
+ word.downcase.include?('c') ? 5 : 0
438
+ end
439
+
440
+ def self.penalty(word)
441
+ word.downcase.include?('s') ? 7 : 0
442
+ end
443
+
444
+ words = %w[ada haskell scala java rust]
445
+
446
+ # 関数を引数として渡す
447
+ def self.ranked_words(words, &score_fn)
448
+ words.sort_by(&score_fn).reverse
449
+ end
450
+
451
+ # 基本スコアでランキング
452
+ ranking1 = ranked_words(words) { |w| score(w) }
453
+ ranking1 # => ["haskell", "rust", "scala", "java", "ada"]
454
+
455
+ # ボーナス付きスコアでランキング
456
+ ranking2 = ranked_words(words) { |w| score(w) + bonus(w) }
457
+ ranking2.first # => "scala"
458
+
459
+ # ボーナスとペナルティ付きスコアでランキング
460
+ ranking3 = ranked_words(words) { |w| score(w) + bonus(w) - penalty(w) }
461
+ ranking3.first # => "java"
462
+ ```
463
+
464
+ ### 4.7 関数合成
465
+
466
+ ```ruby
467
+ # compose: f(g(x))
468
+ def self.compose(f, g)
469
+ ->(x) { f.call(g.call(x)) }
470
+ end
471
+
472
+ # pipe: 左から右へ適用
473
+ def self.pipe(value, *fns)
474
+ fns.reduce(value) { |acc, fn| fn.call(acc) }
475
+ end
476
+
477
+ add_one = ->(x) { x + 1 }
478
+ double = ->(x) { x * 2 }
479
+
480
+ composed = compose(add_one, double)
481
+ composed.call(3) # => 7 (double(3) = 6, add_one(6) = 7)
482
+
483
+ pipe(3, add_one, double) # => 8 (add_one(3) = 4, double(4) = 8)
484
+ ```
485
+
486
+ ---
487
+
488
+ ## 第5章: flat_map とネスト構造
489
+
490
+ ### 5.1 flatten と flat_map
491
+
492
+ **ソースファイル**: `app/ruby/src/ch05_flatmap.rb`
493
+
494
+ #### flatten - ネストした配列を平坦化
495
+
496
+ ```ruby
497
+ Book = Struct.new(:title, :authors, keyword_init: true)
498
+
499
+ books = [
500
+ Book.new(title: 'FP in Scala', authors: %w[Chiusano Bjarnason]),
501
+ Book.new(title: 'The Hobbit', authors: ['Tolkien'])
502
+ ]
503
+
504
+ # map だけだとネストする
505
+ author_lists = books.map(&:authors)
506
+ # [["Chiusano", "Bjarnason"], ["Tolkien"]]
507
+
508
+ # flatten で平坦化
509
+ authors = author_lists.flatten
510
+ # ["Chiusano", "Bjarnason", "Tolkien"]
511
+ ```
512
+
513
+ ```plantuml
514
+ @startuml
515
+ !theme plain
516
+
517
+ rectangle "flatten の動作" {
518
+ card "[['A', 'B'], ['C']]" as nested
519
+ card "flatten" as op
520
+ card "['A', 'B', 'C']" as flat
521
+
522
+ nested --> op
523
+ op --> flat
524
+ }
525
+
526
+ @enduml
527
+ ```
528
+
529
+ #### flat_map = map + flatten
530
+
531
+ ```ruby
532
+ # map して flatten
533
+ authors1 = books.map(&:authors).flatten
534
+
535
+ # flat_map で同じことを1行で
536
+ authors2 = books.flat_map(&:authors)
537
+
538
+ authors1 == authors2 # => true
539
+ # ["Chiusano", "Bjarnason", "Tolkien"]
540
+ ```
541
+
542
+ ### 5.2 flat_map によるサイズの変化
543
+
544
+ ```ruby
545
+ # 要素数が増える (1 -> 2)
546
+ [1, 2, 3].flat_map { |i| [i, i + 10] }
547
+ # => [1, 11, 2, 12, 3, 13] - 6要素
548
+
549
+ # 要素数が同じ (1 -> 1)
550
+ [1, 2, 3].flat_map { |i| [i * 2] }
551
+ # => [2, 4, 6] - 3要素
552
+
553
+ # 要素数が減る(フィルタリング効果)
554
+ [1, 2, 3].flat_map { |i| i.even? ? [i] : [] }
555
+ # => [2] - 1要素
556
+ ```
557
+
558
+ ```plantuml
559
+ @startuml
560
+ !theme plain
561
+
562
+ rectangle "flat_map とサイズの変化" {
563
+ rectangle "増加" as inc {
564
+ card "[1, 2, 3]" as i1
565
+ card "{ |i| [i, i+10] }" as f1
566
+ card "[1, 11, 2, 12, 3, 13]" as r1
567
+ i1 --> f1
568
+ f1 --> r1
569
+ }
570
+
571
+ rectangle "減少(フィルタ)" as dec {
572
+ card "[1, 2, 3]" as i2
573
+ card "{ |i| i.even? ? [i] : [] }" as f2
574
+ card "[2]" as r2
575
+ i2 --> f2
576
+ f2 --> r2
577
+ }
578
+ }
579
+
580
+ @enduml
581
+ ```
582
+
583
+ ### 5.3 ネストした flat_map
584
+
585
+ 複数のリストを組み合わせる場合、flat_map をネストします。
586
+
587
+ ```ruby
588
+ Book = Struct.new(:title, :authors, keyword_init: true)
589
+ Movie = Struct.new(:title, keyword_init: true)
590
+
591
+ def book_adaptations(author)
592
+ case author
593
+ when 'Tolkien'
594
+ [Movie.new(title: 'An Unexpected Journey'), Movie.new(title: 'The Desolation of Smaug')]
595
+ else
596
+ []
597
+ end
598
+ end
599
+
600
+ books = [
601
+ Book.new(title: 'FP in Scala', authors: %w[Chiusano Bjarnason]),
602
+ Book.new(title: 'The Hobbit', authors: ['Tolkien'])
603
+ ]
604
+
605
+ # ネストした flat_map
606
+ recommendations = books.flat_map do |book|
607
+ book.authors.flat_map do |author|
608
+ book_adaptations(author).map do |movie|
609
+ "You may like #{movie.title}, because you liked #{author}'s #{book.title}"
610
+ end
611
+ end
612
+ end
613
+
614
+ # 結果:
615
+ # [
616
+ # "You may like An Unexpected Journey, because you liked Tolkien's The Hobbit",
617
+ # "You may like The Desolation of Smaug, because you liked Tolkien's The Hobbit"
618
+ # ]
619
+ ```
620
+
621
+ ```plantuml
622
+ @startuml
623
+ !theme plain
624
+
625
+ rectangle "ネストした flat_map のフロー" {
626
+ card "books" as books
627
+ card "book.authors" as authors
628
+ card "book_adaptations(author)" as movies
629
+ card "recommendation string" as result
630
+
631
+ books --> authors : flat_map
632
+ authors --> movies : flat_map
633
+ movies --> result : map
634
+ }
635
+
636
+ note bottom
637
+ 最後だけ map
638
+ 途中は flat_map
639
+ end note
640
+
641
+ @enduml
642
+ ```
643
+
644
+ ### 5.4 デカルト積(全組み合わせ)
645
+
646
+ ```ruby
647
+ def self.cartesian_product(list1, list2)
648
+ list1.flat_map do |a|
649
+ list2.map do |b|
650
+ [a, b]
651
+ end
652
+ end
653
+ end
654
+
655
+ cartesian_product([1, 2], %w[a b])
656
+ # => [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
657
+
658
+ # 3つのリストの組み合わせ
659
+ def self.triplets(list1, list2, list3)
660
+ list1.flat_map do |a|
661
+ list2.flat_map do |b|
662
+ list3.map do |c|
663
+ [a, b, c]
664
+ end
665
+ end
666
+ end
667
+ end
668
+ ```
669
+
670
+ ### 5.5 円内の点の判定
671
+
672
+ ```ruby
673
+ Point = Struct.new(:x, :y, keyword_init: true) do
674
+ def distance_from_origin
675
+ Math.sqrt(x * x + y * y)
676
+ end
677
+ end
678
+
679
+ def inside?(point, radius)
680
+ point.x * point.x + point.y * point.y <= radius * radius
681
+ end
682
+
683
+ points = [Point.new(x: 5, y: 2), Point.new(x: 1, y: 1)]
684
+ radiuses = [2, 1]
685
+
686
+ # 全組み合わせを生成
687
+ results = radiuses.flat_map do |r|
688
+ points.map do |point|
689
+ "Point(#{point.x}, #{point.y}) is within radius #{r}: #{inside?(point, r)}"
690
+ end
691
+ end
692
+
693
+ # フィルタリング(条件に合うもののみ)
694
+ inside_points = radiuses.flat_map do |r|
695
+ points.flat_map do |point|
696
+ inside?(point, r) ? [{ point: point, radius: r }] : []
697
+ end
698
+ end
699
+ ```
700
+
701
+ ### 5.6 モナディックパターンのプレビュー
702
+
703
+ flat_map を使ったエラーハンドリングのパターンです(Part III で詳しく学びます)。
704
+
705
+ ```ruby
706
+ # 安全な除算(結果を配列で返す)
707
+ def self.safe_divide(a, b)
708
+ b.zero? ? [] : [a / b]
709
+ end
710
+
711
+ # 操作をチェーン
712
+ def self.safe_calculation(a, b, c)
713
+ safe_divide(a, b).flat_map do |result1|
714
+ safe_divide(result1, c)
715
+ end
716
+ end
717
+
718
+ safe_calculation(100, 2, 5) # => [10]
719
+ safe_calculation(100, 0, 5) # => [] (ゼロ除算は空配列)
720
+ safe_calculation(100, 2, 0) # => []
721
+
722
+ # パースと計算の組み合わせ
723
+ def self.safe_parse_int(str)
724
+ [Integer(str)]
725
+ rescue ArgumentError
726
+ []
727
+ end
728
+
729
+ def self.parse_and_divide(str1, str2)
730
+ safe_parse_int(str1).flat_map do |a|
731
+ safe_parse_int(str2).flat_map do |b|
732
+ safe_divide(a, b)
733
+ end
734
+ end
735
+ end
736
+
737
+ parse_and_divide('10', '2') # => [5]
738
+ parse_and_divide('abc', '2') # => [] (パースエラー)
739
+ parse_and_divide('10', '0') # => [] (ゼロ除算)
740
+ ```
741
+
742
+ ---
743
+
744
+ ## まとめ
745
+
746
+ ### Part II で学んだこと
747
+
748
+ ```plantuml
749
+ @startuml
750
+ !theme plain
751
+
752
+ rectangle "Part II: 関数型スタイルのプログラミング" {
753
+ rectangle "第3章" as ch3 {
754
+ card "イミュータブルデータ"
755
+ card "take / drop / slice"
756
+ card "データ変換パターン"
757
+ }
758
+
759
+ rectangle "第4章" as ch4 {
760
+ card "高階関数"
761
+ card "map / select / reduce"
762
+ card "関数を返す関数"
763
+ card "カリー化"
764
+ }
765
+
766
+ rectangle "第5章" as ch5 {
767
+ card "flatten / flat_map"
768
+ card "ネストした変換"
769
+ card "デカルト積"
770
+ card "モナディックパターン"
771
+ }
772
+ }
773
+
774
+ ch3 --> ch4
775
+ ch4 --> ch5
776
+
777
+ @enduml
778
+ ```
779
+
780
+ ### キーポイント
781
+
782
+ | 章 | 主要概念 | Ruby のキー操作 |
783
+ |----|----------|----------------|
784
+ | 第3章 | イミュータブル | `+`, `take`, `drop`, `[]` |
785
+ | 第4章 | 高階関数 | `map`, `select`, `reduce`, `sort_by` |
786
+ | 第5章 | 平坦化 | `flatten`, `flat_map` |
787
+
788
+ ### Scala との対応
789
+
790
+ | Scala | Ruby | 説明 |
791
+ |-------|------|------|
792
+ | `appended` | `+ [elem]` | 要素追加 |
793
+ | `slice` | `[start...end]` | 切り出し |
794
+ | `map` | `map` | 変換 |
795
+ | `filter` | `select` | 抽出 |
796
+ | `foldLeft` | `reduce` | 畳み込み |
797
+ | `flatMap` | `flat_map` | 平坦化変換 |
798
+ | `case class` | `Struct` | データ構造 |
799
+ | `=>` (lambda) | `->` (lambda) | 無名関数 |
800
+
801
+ ### 重要な法則
802
+
803
+ 1. **イミュータブルデータ**: 元のデータは変更せず、新しいデータを作成する
804
+ 2. **関数は値**: 関数を引数として渡したり、戻り値として返したりできる
805
+ 3. **flat_map パターン**: ネストした構造を平坦化しながら変換する
806
+ 4. **空配列によるエラー表現**: `[]` を返すことでエラーケースを表現できる
807
+
808
+ ### 次のステップ
809
+
810
+ Part III では、以下のトピックを学びます:
811
+
812
+ - dry-monads の `Maybe` 型による安全なエラーハンドリング
813
+ - `Result` 型と複合的なエラー処理
814
+ - モナディックな操作の実践
815
+
816
+ ---
817
+
818
+ ## 演習問題
819
+
820
+ ### 問題 1: イミュータブルな操作
821
+
822
+ 配列の中央に要素を挿入する関数を実装してください。
823
+
824
+ ```ruby
825
+ def insert_at_middle(list, element)
826
+ # 実装してください
827
+ end
828
+
829
+ # 期待される動作
830
+ insert_at_middle(%w[a b c d], 'X') # => ["a", "b", "X", "c", "d"]
831
+ insert_at_middle(%w[a b], 'X') # => ["a", "X", "b"]
832
+ ```
833
+
834
+ <details>
835
+ <summary>解答</summary>
836
+
837
+ ```ruby
838
+ def insert_at_middle(list, element)
839
+ middle = list.size / 2
840
+ before = list.take(middle)
841
+ after = list.drop(middle)
842
+ before + [element] + after
843
+ end
844
+ ```
845
+
846
+ </details>
847
+
848
+ ### 問題 2: 高階関数
849
+
850
+ 条件を満たす要素の数をカウントする関数を実装してください。
851
+
852
+ ```ruby
853
+ def count_where(list, &predicate)
854
+ # 実装してください
855
+ end
856
+
857
+ # 期待される動作
858
+ count_where([1, 2, 3, 4, 5]) { |i| i > 3 } # => 2
859
+ count_where(%w[a bb ccc]) { |s| s.length > 1 } # => 2
860
+ ```
861
+
862
+ <details>
863
+ <summary>解答</summary>
864
+
865
+ ```ruby
866
+ def count_where(list, &predicate)
867
+ list.count(&predicate)
868
+ end
869
+
870
+ # または reduce を使って
871
+ def count_where2(list, &predicate)
872
+ list.reduce(0) { |count, elem| predicate.call(elem) ? count + 1 : count }
873
+ end
874
+ ```
875
+
876
+ </details>
877
+
878
+ ### 問題 3: flat_map
879
+
880
+ 以下のネストした flat_map をより読みやすく書き換えてください。
881
+
882
+ ```ruby
883
+ result = [1, 2].flat_map do |x|
884
+ [10, 20].flat_map do |y|
885
+ [100, 200].map do |z|
886
+ x + y + z
887
+ end
888
+ end
889
+ end
890
+ ```
891
+
892
+ <details>
893
+ <summary>解答</summary>
894
+
895
+ ```ruby
896
+ # メソッドに分離
897
+ def triplet_sums(xs, ys, zs)
898
+ xs.flat_map do |x|
899
+ ys.flat_map do |y|
900
+ zs.map do |z|
901
+ x + y + z
902
+ end
903
+ end
904
+ end
905
+ end
906
+
907
+ result = triplet_sums([1, 2], [10, 20], [100, 200])
908
+ # => [111, 211, 121, 221, 112, 212, 122, 222]
909
+ ```
910
+
911
+ </details>
912
+
913
+ ### 問題 4: flat_map によるフィルタリング
914
+
915
+ `select` を使わずに、flat_map だけで偶数のみを抽出するコードを書いてください。
916
+
917
+ ```ruby
918
+ numbers = [1, 2, 3, 4, 5, 6]
919
+ # 偶数のみを抽出: [2, 4, 6]
920
+ ```
921
+
922
+ <details>
923
+ <summary>解答</summary>
924
+
925
+ ```ruby
926
+ even_numbers = numbers.flat_map do |n|
927
+ n.even? ? [n] : []
928
+ end
929
+
930
+ # または関数に分離
931
+ def even_filter(n)
932
+ n.even? ? [n] : []
933
+ end
934
+
935
+ even_numbers2 = numbers.flat_map { |n| even_filter(n) }
936
+ ```
937
+
938
+ </details>