@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,838 @@
1
+ # Part II: 関数型スタイルのプログラミング
2
+
3
+ 本章では、関数型プログラミングの核心となるテクニックを学びます。イミュータブルなデータ操作、高階関数、そして `flat_map` と for 内包表記による複雑なデータ変換を習得します。
4
+
5
+ ---
6
+
7
+ ## 第3章: イミュータブルなデータ操作
8
+
9
+ ### 3.1 イミュータブルとは
10
+
11
+ イミュータブル(不変)とは、一度作成されたデータが変更されないことを意味します。Elixir ではすべてのデータがイミュータブルです。データを「変更」する代わりに、新しいデータを「作成」します。
12
+
13
+ ```plantuml
14
+ @startuml
15
+ !theme plain
16
+
17
+ rectangle "ミュータブル(可変)" as mut {
18
+ card "list = [A, B]" as m1
19
+ card "list.push(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
+ ### 3.2 リストの基本操作
37
+
38
+ **ソースファイル**: `app/elixir/lib/ch03/immutable_data.ex`
39
+
40
+ #### 要素の追加
41
+
42
+ ```elixir
43
+ # 末尾に追加
44
+ def append(list, element), do: list ++ [element]
45
+
46
+ # 先頭に追加(効率的)
47
+ def prepend(list, element), do: [element | list]
48
+
49
+ # 使用例
50
+ iex> append(["Apple", "Book"], "Mango")
51
+ ["Apple", "Book", "Mango"]
52
+
53
+ iex> prepend(["Apple", "Book"], "Mango")
54
+ ["Mango", "Apple", "Book"]
55
+ ```
56
+
57
+ #### スライス操作
58
+
59
+ ```elixir
60
+ # 最初の N 要素
61
+ def first_n(list, n), do: Enum.take(list, n)
62
+
63
+ # 最後の N 要素
64
+ def last_n(list, n), do: Enum.take(list, -n)
65
+
66
+ # 最初の N 要素を除く
67
+ def drop_first_n(list, n), do: Enum.drop(list, n)
68
+
69
+ # 使用例
70
+ iex> first_n(["a", "b", "c", "d"], 2)
71
+ ["a", "b"]
72
+
73
+ iex> last_n(["a", "b", "c", "d"], 2)
74
+ ["c", "d"]
75
+ ```
76
+
77
+ ```plantuml
78
+ @startuml
79
+ !theme plain
80
+
81
+ rectangle "Enum.slice(list, start, amount)" {
82
+ card "[\"a\", \"b\", \"c\", \"d\"]" as orig
83
+ card "Enum.slice(list, 1, 2)" as op
84
+ card "[\"b\", \"c\"]" as result
85
+
86
+ orig --> op
87
+ op --> result
88
+ }
89
+
90
+ note bottom of result
91
+ インデックス 1 から
92
+ 2 要素を取得
93
+ end note
94
+
95
+ @enduml
96
+ ```
97
+
98
+ ### 3.3 リストの変換例
99
+
100
+ ```elixir
101
+ # 最初の2要素を末尾に移動
102
+ def move_first_two_to_end(list) do
103
+ first_two = Enum.take(list, 2)
104
+ without_first_two = Enum.drop(list, 2)
105
+ without_first_two ++ first_two
106
+ end
107
+
108
+ iex> move_first_two_to_end(["a", "b", "c"])
109
+ ["c", "a", "b"]
110
+
111
+ # 中央に要素を挿入
112
+ def insert_at_middle(list, element) do
113
+ middle = div(length(list), 2)
114
+ before = Enum.take(list, middle)
115
+ after_middle = Enum.drop(list, middle)
116
+ before ++ [element] ++ after_middle
117
+ end
118
+
119
+ iex> insert_at_middle(["a", "b", "c", "d"], "X")
120
+ ["a", "b", "X", "c", "d"]
121
+ ```
122
+
123
+ ### 3.4 旅程の再計画
124
+
125
+ 旅行の計画変更をイミュータブルに行う例です。
126
+
127
+ ```elixir
128
+ def replan(plan, new_city, before_city) do
129
+ before_city_index = Enum.find_index(plan, &(&1 == before_city))
130
+ cities_before = Enum.take(plan, before_city_index)
131
+ cities_after = Enum.drop(plan, before_city_index)
132
+ cities_before ++ [new_city] ++ cities_after
133
+ end
134
+
135
+ iex> plan_a = ["Paris", "Berlin", "Kraków"]
136
+ iex> plan_b = replan(plan_a, "Vienna", "Kraków")
137
+ ["Paris", "Berlin", "Vienna", "Kraków"]
138
+ iex> plan_a # 元の計画は変わらない!
139
+ ["Paris", "Berlin", "Kraków"]
140
+ ```
141
+
142
+ ```plantuml
143
+ @startuml
144
+ !theme plain
145
+
146
+ rectangle "旅程の再計画" {
147
+ card "Plan A:\nParis → Berlin → Kraków" as planA
148
+ card "replan(plan_a, \"Vienna\", \"Kraków\")" as op
149
+ card "Plan B:\nParis → Berlin → Vienna → Kraków" as planB
150
+
151
+ planA --> op
152
+ op --> planB
153
+ }
154
+
155
+ note right of planA
156
+ Plan A は変更されない
157
+ (イミュータブル)
158
+ end note
159
+
160
+ @enduml
161
+ ```
162
+
163
+ ### 3.5 文字列操作
164
+
165
+ 文字列も Elixir ではイミュータブルです。
166
+
167
+ ```elixir
168
+ def abbreviate(name) do
169
+ initial = String.first(name)
170
+ separator_index = :binary.match(name, " ")
171
+
172
+ case separator_index do
173
+ {pos, _} ->
174
+ last_name = String.slice(name, (pos + 1)..-1//1)
175
+ "#{initial}. #{last_name}"
176
+ :nomatch ->
177
+ name
178
+ end
179
+ end
180
+
181
+ iex> abbreviate("Alonzo Church")
182
+ "A. Church"
183
+ ```
184
+
185
+ ### 3.6 イミュータブルの利点
186
+
187
+ | 利点 | 説明 |
188
+ |------|------|
189
+ | 予測可能性 | データが変わらないので追跡が容易 |
190
+ | 並行安全性 | 競合状態が発生しない |
191
+ | テスト容易性 | 状態を気にせずテストできる |
192
+ | デバッグ容易性 | 変更履歴を追いやすい |
193
+
194
+ ---
195
+
196
+ ## 第4章: 関数を値として扱う
197
+
198
+ ### 4.1 高階関数とは
199
+
200
+ 高階関数(Higher-Order Function)とは:
201
+
202
+ 1. 関数を引数として受け取る
203
+ 2. 関数を戻り値として返す
204
+
205
+ ```plantuml
206
+ @startuml
207
+ !theme plain
208
+
209
+ rectangle "高階関数" {
210
+ rectangle "関数を引数に取る" as arg {
211
+ card "Enum.sort_by(list, fn)" as sortBy
212
+ card "Enum.map(list, fn)" as map
213
+ card "Enum.filter(list, fn)" as filter
214
+ }
215
+
216
+ rectangle "関数を返す" as ret {
217
+ card "larger_than(n)" as larger
218
+ card "divisible_by(n)" as divisible
219
+ }
220
+ }
221
+
222
+ @enduml
223
+ ```
224
+
225
+ ### 4.2 Enum.map - 各要素を変換
226
+
227
+ **ソースファイル**: `app/elixir/lib/ch04/higher_order_functions.ex`
228
+
229
+ ```elixir
230
+ # 長さを取得
231
+ iex> Enum.map(["elixir", "rust", "ada"], &String.length/1)
232
+ [6, 4, 3]
233
+
234
+ # 2倍にする
235
+ iex> Enum.map([5, 1, 2, 4, 0], &(&1 * 2))
236
+ [10, 2, 4, 8, 0]
237
+
238
+ # 省略記法(キャプチャ演算子)
239
+ iex> Enum.map([1, 2, 3], &(&1 * 2))
240
+ [2, 4, 6]
241
+ ```
242
+
243
+ ```plantuml
244
+ @startuml
245
+ !theme plain
246
+
247
+ rectangle "Enum.map の動作" {
248
+ card "[\"elixir\", \"rust\", \"ada\"]" as input
249
+ card "String.length/1 を各要素に適用" as op
250
+ card "[6, 4, 3]" as output
251
+
252
+ input --> op
253
+ op --> output
254
+ }
255
+
256
+ @enduml
257
+ ```
258
+
259
+ ### 4.3 Enum.filter - 条件に合う要素を抽出
260
+
261
+ ```elixir
262
+ # 奇数を抽出
263
+ iex> Enum.filter([5, 1, 2, 4, 0], &(rem(&1, 2) == 1))
264
+ [5, 1]
265
+
266
+ # 4より大きい要素
267
+ iex> Enum.filter([5, 1, 2, 4, 0], &(&1 > 4))
268
+ [5]
269
+ ```
270
+
271
+ ### 4.4 Enum.reduce - 畳み込み
272
+
273
+ ```elixir
274
+ # 合計
275
+ iex> Enum.reduce([5, 1, 2, 4, 100], 0, &(&1 + &2))
276
+ 112
277
+
278
+ # 最大値
279
+ iex> Enum.reduce([5, 1, 2, 4, 15], 0, fn i, max ->
280
+ ...> if i > max, do: i, else: max
281
+ ...> end)
282
+ 15
283
+ ```
284
+
285
+ ```plantuml
286
+ @startuml
287
+ !theme plain
288
+
289
+ rectangle "Enum.reduce の動作" {
290
+ card "初期値: 0" as init
291
+ card "0 + 5 = 5" as s1
292
+ card "5 + 1 = 6" as s2
293
+ card "6 + 2 = 8" as s3
294
+ card "8 + 4 = 12" as s4
295
+ card "12 + 100 = 112" as s5
296
+
297
+ init --> s1
298
+ s1 --> s2
299
+ s2 --> s3
300
+ s3 --> s4
301
+ s4 --> s5
302
+ }
303
+
304
+ @enduml
305
+ ```
306
+
307
+ ### 4.5 関数を返す関数
308
+
309
+ ```elixir
310
+ # N より大きいかを判定する関数を返す
311
+ def larger_than(n), do: fn i -> i > n end
312
+
313
+ iex> larger = larger_than(4)
314
+ iex> larger.(5)
315
+ true
316
+ iex> larger.(3)
317
+ false
318
+
319
+ # フィルタリングに使用
320
+ iex> Enum.filter([5, 1, 2, 4, 0], larger_than(4))
321
+ [5]
322
+ ```
323
+
324
+ ```plantuml
325
+ @startuml
326
+ !theme plain
327
+
328
+ rectangle "関数を返す関数" {
329
+ card "larger_than(4)" as call
330
+ card "fn i -> i > 4 end" as fn
331
+ card "filter に渡す" as filter
332
+
333
+ call --> fn : 関数を生成
334
+ fn --> filter : 生成された関数を使用
335
+ }
336
+
337
+ note bottom
338
+ larger_than(4) は
339
+ 「4より大きいか判定する関数」を返す
340
+ end note
341
+
342
+ @enduml
343
+ ```
344
+
345
+ ### 4.6 ワードスコアリングの例
346
+
347
+ 複数のスコアリングロジックを組み合わせる例です。
348
+
349
+ ```elixir
350
+ def score(word), do: word |> String.replace("a", "") |> String.length()
351
+ def bonus(word), do: if String.contains?(word, "c"), do: 5, else: 0
352
+ def penalty(word), do: if String.contains?(word, "s"), do: 7, else: 0
353
+
354
+ # スコア関数でランキングを作成
355
+ def ranked_words(word_score, words) do
356
+ words
357
+ |> Enum.sort_by(word_score)
358
+ |> Enum.reverse()
359
+ end
360
+
361
+ words = ["ada", "haskell", "scala", "java", "rust"]
362
+
363
+ # 基本スコアでランキング
364
+ ranked_words(&score/1, words)
365
+ # ["haskell", "rust", "scala", "java", "ada"]
366
+
367
+ # ボーナス付きスコアでランキング
368
+ ranked_words(fn w -> score(w) + bonus(w) end, words)
369
+ # ["scala", "haskell", "rust", "java", "ada"]
370
+
371
+ # ボーナスとペナルティ付きスコアでランキング
372
+ ranked_words(fn w -> score(w) + bonus(w) - penalty(w) end, words)
373
+ # ["java", "scala", "ada", "haskell", "rust"]
374
+ ```
375
+
376
+ ### 4.7 Elixir のキャプチャ演算子
377
+
378
+ Elixir では `&` を使って関数を簡潔に参照・定義できます。
379
+
380
+ ```elixir
381
+ # 名前付き関数の参照
382
+ &String.length/1
383
+
384
+ # 無名関数の短縮形
385
+ &(&1 * 2) # fn x -> x * 2 end と同等
386
+ &(&1 + &2) # fn a, b -> a + b end と同等
387
+ &String.upcase(&1) # fn s -> String.upcase(s) end と同等
388
+ ```
389
+
390
+ ---
391
+
392
+ ## 第5章: flat_map とネスト構造
393
+
394
+ ### 5.1 flatten と flat_map
395
+
396
+ **ソースファイル**: `app/elixir/lib/ch05/flat_map_and_comprehensions.ex`
397
+
398
+ #### List.flatten - ネストしたリストを平坦化
399
+
400
+ ```elixir
401
+ iex> List.flatten([[1, 2], [3], [4, 5]])
402
+ [1, 2, 3, 4, 5]
403
+
404
+ # 書籍リストから全著者を抽出
405
+ books = [
406
+ %{title: "FP in Scala", authors: ["Chiusano", "Bjarnason"]},
407
+ %{title: "The Hobbit", authors: ["Tolkien"]}
408
+ ]
409
+
410
+ books
411
+ |> Enum.map(& &1.authors)
412
+ |> List.flatten()
413
+ # ["Chiusano", "Bjarnason", "Tolkien"]
414
+ ```
415
+
416
+ ```plantuml
417
+ @startuml
418
+ !theme plain
419
+
420
+ rectangle "List.flatten の動作" {
421
+ card "[[\"A\", \"B\"], [\"C\"]]" as nested
422
+ card "List.flatten" as op
423
+ card "[\"A\", \"B\", \"C\"]" as flat
424
+
425
+ nested --> op
426
+ op --> flat
427
+ }
428
+
429
+ @enduml
430
+ ```
431
+
432
+ #### Enum.flat_map = map + flatten
433
+
434
+ ```elixir
435
+ # map して flatten
436
+ books |> Enum.map(& &1.authors) |> List.flatten()
437
+
438
+ # flat_map で同じことを1行で
439
+ books |> Enum.flat_map(& &1.authors)
440
+ # ["Chiusano", "Bjarnason", "Tolkien"]
441
+ ```
442
+
443
+ ### 5.2 flat_map によるリストサイズの変化
444
+
445
+ ```elixir
446
+ # 要素数が増える
447
+ Enum.flat_map([1, 2, 3], fn i -> [i, i + 10] end)
448
+ # [1, 11, 2, 12, 3, 13] - 6要素
449
+
450
+ # 要素数が同じ
451
+ Enum.flat_map([1, 2, 3], fn i -> [i * 2] end)
452
+ # [2, 4, 6] - 3要素
453
+
454
+ # 要素数が減る(フィルタリング効果)
455
+ Enum.flat_map([1, 2, 3], fn i ->
456
+ if rem(i, 2) == 0, do: [i], else: []
457
+ end)
458
+ # [2] - 1要素
459
+ ```
460
+
461
+ ```plantuml
462
+ @startuml
463
+ !theme plain
464
+
465
+ rectangle "flat_map とサイズの変化" {
466
+ rectangle "増加" as inc {
467
+ card "[1, 2, 3]" as i1
468
+ card "fn i -> [i, i+10] end" as f1
469
+ card "[1, 11, 2, 12, 3, 13]" as r1
470
+ i1 --> f1
471
+ f1 --> r1
472
+ }
473
+
474
+ rectangle "減少(フィルタ)" as dec {
475
+ card "[1, 2, 3]" as i2
476
+ card "fn i -> if even, [i], else [] end" as f2
477
+ card "[2]" as r2
478
+ i2 --> f2
479
+ f2 --> r2
480
+ }
481
+ }
482
+
483
+ @enduml
484
+ ```
485
+
486
+ ### 5.3 ネストした flat_map
487
+
488
+ 複数のリストを組み合わせる場合、flat_map をネストします。
489
+
490
+ ```elixir
491
+ defmodule Book do
492
+ defstruct [:title, :authors]
493
+ end
494
+
495
+ defmodule Movie do
496
+ defstruct [:title]
497
+ end
498
+
499
+ def book_adaptations("Tolkien") do
500
+ [%Movie{title: "An Unexpected Journey"}, %Movie{title: "The Desolation of Smaug"}]
501
+ end
502
+ def book_adaptations(_), do: []
503
+
504
+ books = [
505
+ %Book{title: "FP in Scala", authors: ["Chiusano", "Bjarnason"]},
506
+ %Book{title: "The Hobbit", authors: ["Tolkien"]}
507
+ ]
508
+
509
+ # ネストした flat_map
510
+ Enum.flat_map(books, fn book ->
511
+ Enum.flat_map(book.authors, fn author ->
512
+ Enum.map(book_adaptations(author), fn movie ->
513
+ "You may like #{movie.title}, because you liked #{author}'s #{book.title}"
514
+ end)
515
+ end)
516
+ end)
517
+ # ["You may like An Unexpected Journey, because you liked Tolkien's The Hobbit",
518
+ # "You may like The Desolation of Smaug, because you liked Tolkien's The Hobbit"]
519
+ ```
520
+
521
+ ### 5.4 for 内包表記
522
+
523
+ ネストした flat_map は for 内包表記で読みやすく書けます。
524
+
525
+ ```elixir
526
+ # flat_map/map 版
527
+ Enum.flat_map(books, fn book ->
528
+ Enum.flat_map(book.authors, fn author ->
529
+ Enum.map(book_adaptations(author), fn movie ->
530
+ "You may like #{movie.title}, because you liked #{author}'s #{book.title}"
531
+ end)
532
+ end)
533
+ end)
534
+
535
+ # for 内包表記版(等価)
536
+ for book <- books,
537
+ author <- book.authors,
538
+ movie <- book_adaptations(author) do
539
+ "You may like #{movie.title}, because you liked #{author}'s #{book.title}"
540
+ end
541
+ ```
542
+
543
+ ```plantuml
544
+ @startuml
545
+ !theme plain
546
+
547
+ rectangle "for 内包表記の構造" {
548
+ card "for x <- xs,\n y <- ys,\n z <- zs do\n f(x, y, z)\nend" as forComp
549
+
550
+ card "Enum.flat_map(xs, fn x ->\n Enum.flat_map(ys, fn y ->\n Enum.map(zs, fn z ->\n f(x, y, z)\n end)\n end)\nend)" as flatMaps
551
+
552
+ forComp <--> flatMaps : 等価
553
+ }
554
+
555
+ note bottom
556
+ for 内包表記は
557
+ flat_map/map の糖衣構文
558
+ end note
559
+
560
+ @enduml
561
+ ```
562
+
563
+ ### 5.5 ガード式によるフィルタリング
564
+
565
+ for 内包表記では条件でフィルタリングもできます。
566
+
567
+ ```elixir
568
+ defmodule Point do
569
+ defstruct [:x, :y]
570
+ end
571
+
572
+ def inside?(%Point{x: x, y: y}, radius) do
573
+ radius * radius >= x * x + y * y
574
+ end
575
+
576
+ points = [%Point{x: 5, y: 2}, %Point{x: 1, y: 1}]
577
+ radiuses = [2, 1]
578
+
579
+ # 全組み合わせを生成
580
+ for r <- radiuses,
581
+ point <- points do
582
+ "Point(#{point.x}, #{point.y}) is within a radius of #{r}: #{inside?(point, r)}"
583
+ end
584
+
585
+ # 円内の点のみ抽出(ガード式使用)
586
+ for r <- radiuses,
587
+ point <- points,
588
+ inside?(point, r) do # フィルタ条件
589
+ "Point(#{point.x}, #{point.y}) is within a radius of #{r}"
590
+ end
591
+ # ["Point(1, 1) is within a radius of 2"]
592
+ ```
593
+
594
+ ### 5.6 for 内包表記と結果の型
595
+
596
+ Elixir の for 内包表記は `into:` オプションで出力先を変更できます。
597
+
598
+ ```elixir
599
+ # デフォルト: リストを返す
600
+ for i <- [1, 2, 3], do: i * 2
601
+ # [2, 4, 6]
602
+
603
+ # MapSet を返す
604
+ for item <- [1, 2, 2, 3], into: MapSet.new(), do: item
605
+ # MapSet.new([1, 2, 3])
606
+
607
+ # Map を返す
608
+ for s <- ["a", "bb", "ccc"], into: %{}, do: {s, String.length(s)}
609
+ # %{"a" => 1, "bb" => 2, "ccc" => 3}
610
+
611
+ # 文字列を返す
612
+ for <<c <- "hello">>, into: "", do: <<c + 1>>
613
+ # "ifmmp"
614
+ ```
615
+
616
+ ```plantuml
617
+ @startuml
618
+ !theme plain
619
+
620
+ rectangle "for 内包表記の出力先" {
621
+ card "デフォルト" as default
622
+ card "into: MapSet.new()" as set
623
+ card "into: %{}" as map
624
+ card "into: \"\"" as string
625
+
626
+ card "リスト" as listRes
627
+ card "MapSet" as setRes
628
+ card "Map" as mapRes
629
+ card "文字列" as stringRes
630
+
631
+ default --> listRes
632
+ set --> setRes
633
+ map --> mapRes
634
+ string --> stringRes
635
+ }
636
+
637
+ @enduml
638
+ ```
639
+
640
+ ---
641
+
642
+ ## Scala vs Elixir 比較
643
+
644
+ | 操作 | Scala | Elixir |
645
+ |------|-------|--------|
646
+ | 末尾追加 | `list.appended(x)` | `list ++ [x]` |
647
+ | 先頭追加 | `x :: list` | `[x \| list]` |
648
+ | スライス | `list.slice(a, b)` | `Enum.slice(list, a, b-a)` |
649
+ | map | `list.map(f)` | `Enum.map(list, f)` |
650
+ | filter | `list.filter(f)` | `Enum.filter(list, f)` |
651
+ | foldLeft | `list.foldLeft(init)(f)` | `Enum.reduce(list, init, f)` |
652
+ | flatMap | `list.flatMap(f)` | `Enum.flat_map(list, f)` |
653
+ | flatten | `list.flatten` | `List.flatten(list)` |
654
+ | for 内包表記 | `for { x <- xs } yield f(x)` | `for x <- xs, do: f(x)` |
655
+
656
+ ---
657
+
658
+ ## まとめ
659
+
660
+ ### Part II で学んだこと
661
+
662
+ ```plantuml
663
+ @startuml
664
+ !theme plain
665
+
666
+ rectangle "Part II: 関数型スタイルのプログラミング" {
667
+ rectangle "第3章" as ch3 {
668
+ card "イミュータブルデータ"
669
+ card "リスト操作"
670
+ card "データ変換パターン"
671
+ }
672
+
673
+ rectangle "第4章" as ch4 {
674
+ card "高階関数"
675
+ card "map / filter / reduce"
676
+ card "関数を返す関数"
677
+ card "キャプチャ演算子"
678
+ }
679
+
680
+ rectangle "第5章" as ch5 {
681
+ card "flatten / flat_map"
682
+ card "ネストした変換"
683
+ card "for 内包表記"
684
+ card "ガード式"
685
+ }
686
+ }
687
+
688
+ ch3 --> ch4
689
+ ch4 --> ch5
690
+
691
+ @enduml
692
+ ```
693
+
694
+ ### キーポイント
695
+
696
+ | 章 | 主要概念 | キー操作 |
697
+ |----|----------|----------|
698
+ | 第3章 | イミュータブル | `++`, `Enum.take`, `Enum.drop`, `Enum.slice` |
699
+ | 第4章 | 高階関数 | `Enum.map`, `Enum.filter`, `Enum.reduce`, `Enum.sort_by` |
700
+ | 第5章 | 平坦化 | `List.flatten`, `Enum.flat_map`, `for` 内包表記 |
701
+
702
+ ### 重要な法則
703
+
704
+ 1. **イミュータブルデータ**: 元のデータは変更せず、新しいデータを作成する
705
+ 2. **関数は値**: 関数を引数として渡したり、戻り値として返したりできる
706
+ 3. **flat_map パターン**: ネストした構造を平坦化しながら変換する
707
+ 4. **for 内包表記**: flat_map/map の糖衣構文として使える
708
+ 5. **パイプ演算子**: データ変換を読みやすく連鎖させる
709
+
710
+ ### 次のステップ
711
+
712
+ Part III では、以下のトピックを学びます:
713
+
714
+ - nil の安全な扱い
715
+ - `{:ok, value}` / `{:error, reason}` パターン
716
+ - `with` 式によるエラーハンドリング
717
+
718
+ ---
719
+
720
+ ## 演習問題
721
+
722
+ ### 問題 1: イミュータブルな操作
723
+
724
+ 以下の関数を実装してください。リストの最初と最後の要素を入れ替える関数です。
725
+
726
+ ```elixir
727
+ def swap_first_last(list)
728
+
729
+ # 期待される動作
730
+ swap_first_last([1, 2, 3, 4]) == [4, 2, 3, 1]
731
+ swap_first_last([1, 2]) == [2, 1]
732
+ ```
733
+
734
+ <details>
735
+ <summary>解答</summary>
736
+
737
+ ```elixir
738
+ def swap_first_last([]), do: []
739
+ def swap_first_last([x]), do: [x]
740
+ def swap_first_last([first | rest]) do
741
+ last = List.last(rest)
742
+ middle = Enum.drop(rest, -1)
743
+ [last | middle] ++ [first]
744
+ end
745
+ ```
746
+
747
+ </details>
748
+
749
+ ### 問題 2: 高階関数
750
+
751
+ 以下の関数を実装してください。条件を満たす要素の数をカウントする関数です。
752
+
753
+ ```elixir
754
+ def count_where(list, predicate)
755
+
756
+ # 期待される動作
757
+ count_where([1, 2, 3, 4, 5], &(&1 > 3)) == 2
758
+ count_where(["a", "bb", "ccc"], &(String.length(&1) > 1)) == 2
759
+ ```
760
+
761
+ <details>
762
+ <summary>解答</summary>
763
+
764
+ ```elixir
765
+ def count_where(list, predicate) do
766
+ Enum.count(list, predicate)
767
+ end
768
+
769
+ # または filter を使って
770
+ def count_where(list, predicate) do
771
+ list |> Enum.filter(predicate) |> length()
772
+ end
773
+
774
+ # または reduce を使って
775
+ def count_where(list, predicate) do
776
+ Enum.reduce(list, 0, fn elem, count ->
777
+ if predicate.(elem), do: count + 1, else: count
778
+ end)
779
+ end
780
+ ```
781
+
782
+ </details>
783
+
784
+ ### 問題 3: for 内包表記
785
+
786
+ 以下のネストした flat_map を for 内包表記で書き換えてください。
787
+
788
+ ```elixir
789
+ Enum.flat_map([1, 2], fn x ->
790
+ Enum.flat_map([10, 20], fn y ->
791
+ Enum.map([100, 200], fn z ->
792
+ x + y + z
793
+ end)
794
+ end)
795
+ end)
796
+ ```
797
+
798
+ <details>
799
+ <summary>解答</summary>
800
+
801
+ ```elixir
802
+ for x <- [1, 2],
803
+ y <- [10, 20],
804
+ z <- [100, 200] do
805
+ x + y + z
806
+ end
807
+
808
+ # 結果: [111, 211, 121, 221, 112, 212, 122, 222]
809
+ ```
810
+
811
+ </details>
812
+
813
+ ### 問題 4: flat_map によるフィルタリング
814
+
815
+ for 内包表記のガード式を使わずに、flat_map だけで偶数のみを抽出するコードを書いてください。
816
+
817
+ ```elixir
818
+ numbers = [1, 2, 3, 4, 5, 6]
819
+ # 偶数のみを抽出: [2, 4, 6]
820
+ ```
821
+
822
+ <details>
823
+ <summary>解答</summary>
824
+
825
+ ```elixir
826
+ Enum.flat_map(numbers, fn n ->
827
+ if rem(n, 2) == 0, do: [n], else: []
828
+ end)
829
+
830
+ # または関数に分離
831
+ def even_filter(n) do
832
+ if rem(n, 2) == 0, do: [n], else: []
833
+ end
834
+
835
+ Enum.flat_map(numbers, &even_filter/1)
836
+ ```
837
+
838
+ </details>