@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,336 @@
1
+ # 第9章: Adapter パターン — 6言語統合ガイド
2
+
3
+ ## 1. はじめに
4
+
5
+ Adapter パターンは、互換性のないインターフェースを接続する GoF パターンです。OOP ではラッパークラスを作成しますが、関数型プログラミングでは**変換関数**がアダプターの役割を果たします。データ形式の変換、API の適応、単位変換など、関数型ではデータ変換パイプラインとして自然に表現されます。
6
+
7
+ > **Elixir の読者へ**: Elixir 版は本章で「I/O と外部システム」を扱っています。Elixir 固有のアプローチについては[コラム](#elixir-コラムio-と外部システム)を参照してください。
8
+
9
+ ## 2. 共通の本質
10
+
11
+ ### Adapter の構造
12
+
13
+ ```
14
+ adapt: A → B
15
+ where A = 既存のインターフェース
16
+ B = 期待されるインターフェース
17
+ ```
18
+
19
+ - **インターフェース適応**: 既存の型を期待される型に変換
20
+ - **双方向変換**: `A → B` と `B → A` の両方を提供
21
+ - **透過的利用**: アダプターを通じて既存コードを再利用
22
+
23
+ ### 典型的なユースケース
24
+
25
+ - **デバイス制御**: VariableLight(調光) → Switchable(オン/オフ)
26
+ - **データ形式変換**: 旧ユーザー形式 → 新ユーザー形式
27
+ - **API レスポンス変換**: 外部 API のレスポンスを内部モデルに変換
28
+ - **単位変換**: 摂氏 ↔ 華氏、通貨変換
29
+
30
+ ## 3. 言語別実装比較
31
+
32
+ ### 3.1 アダプターの実現方法
33
+
34
+ | 言語 | アダプター表現 | インターフェース |
35
+ |------|-------------|---------------|
36
+ | Clojure | 変換関数 + マルチメソッド | プロトコル |
37
+ | Scala | trait 実装 / 関数変換 | trait |
38
+ | F# | 関数 + インターフェース | ISwitchable 等 |
39
+ | Haskell | newtype + 型クラスインスタンス | 型クラス |
40
+ | Rust | trait 実装 / 変換関数 | trait |
41
+
42
+ ### 3.2 デバイスアダプター(VariableLight → Switchable)
43
+
44
+ 調光可能なライト(VariableLight)を単純なオン/オフスイッチ(Switchable)として使うアダプターです。
45
+
46
+ <details>
47
+ <summary>Clojure: プロトコル + 変換関数</summary>
48
+
49
+ ```clojure
50
+ ;; VariableLight は明るさ(0-100)を持つ
51
+ (defn make-variable-light [brightness]
52
+ {:type :variable-light :brightness brightness})
53
+
54
+ ;; Switchable プロトコルへの適応
55
+ (defmulti turn-on :type)
56
+ (defmulti turn-off :type)
57
+ (defmulti is-on? :type)
58
+
59
+ (defmethod turn-on :variable-light [light]
60
+ (assoc light :brightness 100))
61
+
62
+ (defmethod turn-off :variable-light [light]
63
+ (assoc light :brightness 0))
64
+
65
+ (defmethod is-on? :variable-light [light]
66
+ (> (:brightness light) 0))
67
+ ```
68
+
69
+ </details>
70
+
71
+ <details>
72
+ <summary>Scala: trait 実装</summary>
73
+
74
+ ```scala
75
+ trait Switchable:
76
+ def turnOn: Switchable
77
+ def turnOff: Switchable
78
+ def isOn: Boolean
79
+
80
+ case class VariableLight(brightness: Int)
81
+
82
+ case class VariableLightAdapter(light: VariableLight) extends Switchable:
83
+ def turnOn: Switchable = VariableLightAdapter(light.copy(brightness = 100))
84
+ def turnOff: Switchable = VariableLightAdapter(light.copy(brightness = 0))
85
+ def isOn: Boolean = light.brightness > 0
86
+ ```
87
+
88
+ </details>
89
+
90
+ <details>
91
+ <summary>Haskell: newtype + 型クラスインスタンス</summary>
92
+
93
+ ```haskell
94
+ class Switchable a where
95
+ turnOn :: a -> a
96
+ turnOff :: a -> a
97
+ isOn :: a -> Bool
98
+
99
+ data VariableLight = VariableLight { brightness :: Int }
100
+
101
+ newtype VariableLightAdapter = VariableLightAdapter VariableLight
102
+
103
+ instance Switchable VariableLightAdapter where
104
+ turnOn (VariableLightAdapter _) =
105
+ VariableLightAdapter (VariableLight 100)
106
+ turnOff (VariableLightAdapter _) =
107
+ VariableLightAdapter (VariableLight 0)
108
+ isOn (VariableLightAdapter (VariableLight b)) = b > 0
109
+ ```
110
+
111
+ `newtype` で既存の型をラップし、型クラスインスタンスを実装することで、コンパイル時のオーバーヘッドなしにアダプターを実現します。
112
+
113
+ </details>
114
+
115
+ <details>
116
+ <summary>Rust: trait 実装</summary>
117
+
118
+ ```rust
119
+ pub trait Switchable {
120
+ fn turn_on(&self) -> Box<dyn Switchable>;
121
+ fn turn_off(&self) -> Box<dyn Switchable>;
122
+ fn is_on(&self) -> bool;
123
+ }
124
+
125
+ pub struct VariableLight { pub brightness: u8 }
126
+
127
+ pub struct VariableLightAdapter {
128
+ light: VariableLight,
129
+ }
130
+
131
+ impl Switchable for VariableLightAdapter {
132
+ fn turn_on(&self) -> Box<dyn Switchable> {
133
+ Box::new(VariableLightAdapter {
134
+ light: VariableLight { brightness: 100 },
135
+ })
136
+ }
137
+
138
+ fn turn_off(&self) -> Box<dyn Switchable> {
139
+ Box::new(VariableLightAdapter {
140
+ light: VariableLight { brightness: 0 },
141
+ })
142
+ }
143
+
144
+ fn is_on(&self) -> bool { self.light.brightness > 0 }
145
+ }
146
+ ```
147
+
148
+ </details>
149
+
150
+ ### 3.3 データ形式変換アダプター
151
+
152
+ 旧形式のユーザーデータを新形式に変換するアダプターです。
153
+
154
+ <details>
155
+ <summary>データ変換アダプターの比較</summary>
156
+
157
+ ```clojure
158
+ ;; Clojure: 変換関数
159
+ (defn adapt-old-to-new [old-user]
160
+ {:id (:user-id old-user)
161
+ :full-name (str (:first-name old-user) " " (:last-name old-user))
162
+ :email (:email-address old-user)})
163
+ ```
164
+
165
+ ```scala
166
+ // Scala: case class 変換
167
+ case class OldUser(userId: String, firstName: String, lastName: String, emailAddress: String)
168
+ case class NewUser(id: String, fullName: String, email: String)
169
+
170
+ def adaptOldToNew(old: OldUser): NewUser =
171
+ NewUser(old.userId, s"${old.firstName} ${old.lastName}", old.emailAddress)
172
+ ```
173
+
174
+ ```fsharp
175
+ // F#: レコード変換
176
+ let adaptOldToNew (old: OldUser) : NewUser =
177
+ { Id = old.UserId
178
+ FullName = sprintf "%s %s" old.FirstName old.LastName
179
+ Email = old.EmailAddress }
180
+ ```
181
+
182
+ ```haskell
183
+ -- Haskell: 変換関数
184
+ adaptOldToNew :: OldUser -> NewUser
185
+ adaptOldToNew old = NewUser
186
+ { userId = oldUserId old
187
+ , fullName = oldFirstName old ++ " " ++ oldLastName old
188
+ , email = oldEmailAddress old
189
+ }
190
+ ```
191
+
192
+ ```rust
193
+ // Rust: From trait
194
+ impl From<OldUser> for NewUser {
195
+ fn from(old: OldUser) -> Self {
196
+ NewUser {
197
+ id: old.user_id,
198
+ full_name: format!("{} {}", old.first_name, old.last_name),
199
+ email: old.email_address,
200
+ }
201
+ }
202
+ }
203
+
204
+ // 使用: NewUser::from(old_user) or old_user.into()
205
+ ```
206
+
207
+ Rust の `From` trait は標準ライブラリが提供するアダプターパターンの典型です。
208
+
209
+ </details>
210
+
211
+ ### 3.4 双方向アダプター
212
+
213
+ `A → B` と `B → A` の両方を提供するアダプターです。
214
+
215
+ <details>
216
+ <summary>双方向アダプターの比較</summary>
217
+
218
+ ```haskell
219
+ -- Haskell
220
+ data Adapter a b = Adapter
221
+ { adapt :: a -> b
222
+ , unadapt :: b -> a
223
+ }
224
+
225
+ celsiusFahrenheit :: Adapter Double Double
226
+ celsiusFahrenheit = Adapter
227
+ { adapt = \c -> c * 9 / 5 + 32
228
+ , unadapt = \f -> (f - 32) * 5 / 9
229
+ }
230
+ ```
231
+
232
+ ```scala
233
+ // Scala
234
+ case class Adapter[A, B](adapt: A => B, unadapt: B => A)
235
+
236
+ val celsiusFahrenheit = Adapter[Double, Double](
237
+ adapt = c => c * 9.0 / 5 + 32,
238
+ unadapt = f => (f - 32) * 5.0 / 9
239
+ )
240
+ ```
241
+
242
+ ```fsharp
243
+ // F#
244
+ type Adapter<'A, 'B> = { Adapt: 'A -> 'B; Unadapt: 'B -> 'A }
245
+
246
+ let celsiusFahrenheit = {
247
+ Adapt = fun c -> c * 9.0 / 5.0 + 32.0
248
+ Unadapt = fun f -> (f - 32.0) * 5.0 / 9.0
249
+ }
250
+ ```
251
+
252
+ </details>
253
+
254
+ ## 4. 比較分析
255
+
256
+ ### 4.1 OOP Adapter vs 関数型 Adapter
257
+
258
+ | 観点 | OOP | 関数型 |
259
+ |------|-----|--------|
260
+ | アダプター | ラッパークラス | 変換関数 |
261
+ | インターフェース | Java/C# のインターフェース | 型クラス / trait / プロトコル |
262
+ | ボイラープレート | 多い(委譲メソッド) | 少ない(関数のみ) |
263
+ | 双方向 | 2 つのクラス | 関数のペア |
264
+ | 合成 | 複雑 | `compose` / `>>` で合成 |
265
+
266
+ ### 4.2 Rust の From/Into trait
267
+
268
+ Rust は標準ライブラリに `From` / `Into` trait を持ち、型変換のアダプターパターンを言語レベルでサポートしています。`From<A> for B` を実装すると、`Into<B> for A` が自動的に得られます。
269
+
270
+ ### 4.3 言語間のアダプター表現力
271
+
272
+ | 基準 | 最適な言語 | 理由 |
273
+ |------|----------|------|
274
+ | 型安全な変換 | Haskell | newtype + 型クラスでゼロコスト |
275
+ | 標準ライブラリ統合 | Rust | From/Into が標準提供 |
276
+ | 柔軟な変換 | Clojure | マップ変換が自由自在 |
277
+ | 既存型への後付け | Scala | extension メソッド / given |
278
+
279
+ ## 5. Elixir コラム:I/O と外部システム
280
+
281
+ Elixir の第 9 章は Adapter パターンではなく、**I/O と外部システムの抽象化**を扱っています。
282
+
283
+ ### リポジトリパターン
284
+
285
+ ```elixir
286
+ defmodule Repository do
287
+ use Agent
288
+
289
+ def start_link(_opts) do
290
+ Agent.start_link(fn -> %{} end, name: __MODULE__)
291
+ end
292
+
293
+ def save(id, entity) do
294
+ Agent.update(__MODULE__, &Map.put(&1, id, entity))
295
+ end
296
+
297
+ def find(id) do
298
+ Agent.get(__MODULE__, &Map.get(&1, id))
299
+ end
300
+ end
301
+ ```
302
+
303
+ ### HTTP クライアントの抽象化
304
+
305
+ ```elixir
306
+ defmodule HttpClient do
307
+ @callback get(String.t()) :: {:ok, map()} | {:error, term()}
308
+ @callback post(String.t(), map()) :: {:ok, map()} | {:error, term()}
309
+ end
310
+
311
+ defmodule RealHttpClient do
312
+ @behaviour HttpClient
313
+ def get(url), do: HTTPoison.get(url)
314
+ def post(url, body), do: HTTPoison.post(url, Jason.encode!(body))
315
+ end
316
+
317
+ defmodule MockHttpClient do
318
+ @behaviour HttpClient
319
+ def get(_url), do: {:ok, %{status: 200, body: "mock"}}
320
+ def post(_url, _body), do: {:ok, %{status: 201}}
321
+ end
322
+ ```
323
+
324
+ Adapter パターンの「インターフェース適応」は、Elixir では `@behaviour` と `@callback` による**振る舞いの契約**として表現されます。テスト時にモック実装を差し替えることで、外部システムへの依存を分離します。
325
+
326
+ ## 6. まとめ
327
+
328
+ Adapter パターンは、関数型プログラミングで**変換関数**として最も簡潔に表現されます:
329
+
330
+ 1. **関数がアダプター**: 型 A から型 B への変換関数
331
+ 2. **型クラス / trait / プロトコル**: 既存の型に新しいインターフェースを後付け
332
+ 3. **合成可能性**: 複数のアダプターをパイプラインで連鎖
333
+
334
+ ## 言語別個別記事
335
+
336
+ - [Clojure](../clojure/09-adapter-pattern.md) | [Scala](../scala/09-adapter-pattern.md) | [Elixir](../elixir/09-io-and-external-systems.md) | [F#](../fsharp/09-adapter-pattern.md) | [Haskell](../haskell/09-adapter-pattern.md) | [Rust](../rust/09-adapter-pattern.md)
@@ -0,0 +1,303 @@
1
+ # 第10章: Strategy パターン — 6言語統合ガイド
2
+
3
+ ## 1. はじめに
4
+
5
+ Strategy パターンは、アルゴリズムをカプセル化し、実行時に切り替えるための GoF パターンです。OOP ではインターフェースと実装クラスで表現しますが、関数型プログラミングでは**関数そのものが戦略**です。高階関数を使えば、戦略の切り替えは関数の引数を変えるだけで実現できます。
6
+
7
+ > **Elixir の読者へ**: Elixir 版は本章で「並行処理パターン」を扱っています。Elixir 固有のアクターモデルについては[コラム](#elixir-コラム並行処理パターン)を参照してください。
8
+
9
+ ## 2. 共通の本質
10
+
11
+ ### Strategy の構造
12
+
13
+ ```
14
+ Context(strategy) → strategy(data) → result
15
+ ```
16
+
17
+ OOP では Strategy インターフェースを実装するクラスを注入しますが、関数型では**関数を直接渡す**だけです。
18
+
19
+ ### 典型的なユースケース
20
+
21
+ - **料金計算**: 通常・割引・会員・まとめ買い
22
+ - **ソートアルゴリズム**: バブル・クイック・マージ
23
+ - **フォーマット出力**: JSON・XML・CSV
24
+ - **配送料計算**: 通常・エクスプレス・無料
25
+
26
+ ## 3. 言語別実装比較
27
+
28
+ ### 3.1 戦略の表現方法
29
+
30
+ | 言語 | 戦略の表現 | コンテキストへの注入 |
31
+ |------|----------|-----------------|
32
+ | Clojure | 関数 / マルチメソッド | 引数として渡す |
33
+ | Scala | trait / 関数リテラル | 型パラメータ / 引数 |
34
+ | F# | 判別共用体 / 関数 | パイプライン / 引数 |
35
+ | Haskell | newtype でラップした関数 | 引数として渡す |
36
+ | Rust | trait object / クロージャ | ジェネリクス / `Box<dyn Fn>` |
37
+
38
+ ### 3.2 料金計算の Strategy
39
+
40
+ <details>
41
+ <summary>Clojure: 関数ベースの戦略</summary>
42
+
43
+ ```clojure
44
+ ;; 戦略 = 単なる関数
45
+ (defn regular-pricing [amount] amount)
46
+ (defn discount-pricing [rate]
47
+ (fn [amount] (* amount (- 1 rate))))
48
+ (defn member-pricing [amount]
49
+ (* amount 0.9))
50
+ (defn bulk-pricing [threshold discount-rate]
51
+ (fn [amount]
52
+ (if (>= amount threshold)
53
+ (* amount (- 1 discount-rate))
54
+ amount)))
55
+
56
+ ;; コンテキスト
57
+ (defn calculate-total [items pricing-strategy]
58
+ (let [subtotal (reduce + (map :price items))]
59
+ (pricing-strategy subtotal)))
60
+
61
+ ;; 使用
62
+ (calculate-total items (discount-pricing 0.2))
63
+ ```
64
+
65
+ </details>
66
+
67
+ <details>
68
+ <summary>Scala: trait + 関数型ハイブリッド</summary>
69
+
70
+ ```scala
71
+ // trait ベース
72
+ trait PricingStrategy:
73
+ def calculate(amount: Double): Double
74
+
75
+ object RegularPricing extends PricingStrategy:
76
+ def calculate(amount: Double): Double = amount
77
+
78
+ class DiscountPricing(rate: Double) extends PricingStrategy:
79
+ def calculate(amount: Double): Double = amount * (1 - rate)
80
+
81
+ // 関数ベース(より簡潔)
82
+ type PricingFn = Double => Double
83
+
84
+ val regular: PricingFn = identity
85
+ def discount(rate: Double): PricingFn = _ * (1 - rate)
86
+ def bulk(threshold: Double, rate: Double): PricingFn =
87
+ amount => if amount >= threshold then amount * (1 - rate) else amount
88
+
89
+ // 戦略の合成
90
+ def compose(strategies: PricingFn*): PricingFn =
91
+ strategies.reduce(_ andThen _)
92
+ ```
93
+
94
+ </details>
95
+
96
+ <details>
97
+ <summary>Haskell: newtype + モノイド</summary>
98
+
99
+ ```haskell
100
+ newtype PricingStrategy = PricingStrategy { runStrategy :: Double -> Double }
101
+
102
+ regularPricing :: PricingStrategy
103
+ regularPricing = PricingStrategy id
104
+
105
+ discountPricing :: Double -> PricingStrategy
106
+ discountPricing rate = PricingStrategy (\amount -> amount * (1 - rate))
107
+
108
+ memberPricing :: PricingStrategy
109
+ memberPricing = PricingStrategy (\amount -> amount * 0.9)
110
+
111
+ -- 戦略の合成(モノイド)
112
+ composeStrategies :: [PricingStrategy] -> PricingStrategy
113
+ composeStrategies = PricingStrategy . foldr ((.) . runStrategy) id
114
+
115
+ -- コンテキスト
116
+ calculateTotal :: PricingStrategy -> [Item] -> Double
117
+ calculateTotal strategy items =
118
+ runStrategy strategy (sum (map itemPrice items))
119
+ ```
120
+
121
+ Haskell では戦略を `newtype` でラップし、モノイドとして合成可能にしています。
122
+
123
+ </details>
124
+
125
+ <details>
126
+ <summary>F#: 判別共用体 + 関数</summary>
127
+
128
+ ```fsharp
129
+ // 判別共用体版
130
+ type PricingStrategy =
131
+ | Regular
132
+ | Discount of rate: float
133
+ | Member
134
+ | Bulk of threshold: float * rate: float
135
+
136
+ let applyStrategy (strategy: PricingStrategy) (amount: float) : float =
137
+ match strategy with
138
+ | Regular -> amount
139
+ | Discount rate -> amount * (1.0 - rate)
140
+ | Member -> amount * 0.9
141
+ | Bulk(threshold, rate) ->
142
+ if amount >= threshold then amount * (1.0 - rate) else amount
143
+
144
+ // 関数版(より柔軟)
145
+ module FunctionalStrategy =
146
+ let regular: float -> float = id
147
+ let discount rate amount = amount * (1.0 - rate)
148
+ let conditional pred strategy amount =
149
+ if pred amount then strategy amount else amount
150
+ ```
151
+
152
+ </details>
153
+
154
+ <details>
155
+ <summary>Rust: trait + クロージャ</summary>
156
+
157
+ ```rust
158
+ // trait ベース
159
+ pub trait PricingStrategy {
160
+ fn calculate(&self, amount: f64) -> f64;
161
+ }
162
+
163
+ pub struct RegularPricing;
164
+ impl PricingStrategy for RegularPricing {
165
+ fn calculate(&self, amount: f64) -> f64 { amount }
166
+ }
167
+
168
+ pub struct DiscountPricing { pub rate: f64 }
169
+ impl PricingStrategy for DiscountPricing {
170
+ fn calculate(&self, amount: f64) -> f64 {
171
+ amount * (1.0 - self.rate)
172
+ }
173
+ }
174
+
175
+ // クロージャベース(より簡潔)
176
+ pub fn calculate_total(
177
+ items: &[Item],
178
+ strategy: impl Fn(f64) -> f64,
179
+ ) -> f64 {
180
+ let subtotal: f64 = items.iter().map(|i| i.price).sum();
181
+ strategy(subtotal)
182
+ }
183
+
184
+ // 使用
185
+ calculate_total(&items, |amount| amount * 0.8);
186
+ ```
187
+
188
+ </details>
189
+
190
+ ### 3.3 戦略の合成
191
+
192
+ 複数の戦略を組み合わせて新しい戦略を作るパターンです。
193
+
194
+ | 言語 | 合成方法 | 例 |
195
+ |------|---------|-----|
196
+ | Clojure | `comp` | `(comp member-pricing (discount-pricing 0.1))` |
197
+ | Scala | `andThen` | `discount(0.1) andThen bulk(1000, 0.05)` |
198
+ | F# | `>>` | `discount 0.1 >> member` |
199
+ | Haskell | `.` | `runStrategy memberPricing . runStrategy (discountPricing 0.1)` |
200
+ | Rust | クロージャチェーン | `\|amount\| bulk(1000, 0.05, discount(0.1, amount))` |
201
+
202
+ ### 3.4 条件付き戦略
203
+
204
+ 実行時の条件に応じて戦略を選択するパターンです。
205
+
206
+ ```clojure
207
+ ;; Clojure
208
+ (defn select-strategy [customer-type]
209
+ (case customer-type
210
+ :regular regular-pricing
211
+ :member member-pricing
212
+ :vip (discount-pricing 0.3)))
213
+ ```
214
+
215
+ ```scala
216
+ // Scala
217
+ def selectStrategy(customerType: CustomerType): PricingFn =
218
+ customerType match
219
+ case Regular => regular
220
+ case Member => discount(0.1)
221
+ case VIP => discount(0.3)
222
+ ```
223
+
224
+ ## 4. 比較分析
225
+
226
+ ### 4.1 OOP Strategy vs 関数型 Strategy
227
+
228
+ | 観点 | OOP | 関数型 |
229
+ |------|-----|--------|
230
+ | 戦略の定義 | クラス | 関数 |
231
+ | 注入方法 | コンストラクタ / セッター | 関数引数 |
232
+ | 合成 | Composite パターン | 関数合成 |
233
+ | 状態 | フィールドに保持 | クロージャでキャプチャ |
234
+ | ボイラープレート | 多い(インターフェース + 実装クラス) | 少ない(関数のみ) |
235
+
236
+ ### 4.2 trait/型クラス版 vs 関数版
237
+
238
+ 静的型付け言語(Scala, Rust)では、trait/型クラス版と関数版の 2 つのアプローチを並列して提示しています:
239
+
240
+ - **trait/型クラス版**: 名前付きで文書化しやすく、複数メソッドの戦略に適する
241
+ - **関数版**: 簡潔で、単一の振る舞いの切り替えに適する
242
+
243
+ ## 5. Elixir コラム:並行処理パターン
244
+
245
+ Elixir の第 10 章は Strategy パターンではなく、**並行処理パターン**を扱っています。Elixir/Erlang の BEAM VM は軽量プロセスとメッセージパッシングを基盤とし、GoF の Strategy とは異なるアプローチで「振る舞いの切り替え」を実現します。
246
+
247
+ ### アクターモデルの基礎
248
+
249
+ ```elixir
250
+ # プロセス間のメッセージパッシング
251
+ defmodule Counter do
252
+ use Agent
253
+
254
+ def start_link(initial) do
255
+ Agent.start_link(fn -> initial end, name: __MODULE__)
256
+ end
257
+
258
+ def increment, do: Agent.update(__MODULE__, &(&1 + 1))
259
+ def value, do: Agent.get(__MODULE__, & &1)
260
+ end
261
+ ```
262
+
263
+ ### GenServer による状態管理
264
+
265
+ ```elixir
266
+ defmodule BankAccount do
267
+ use GenServer
268
+
269
+ def init(balance), do: {:ok, balance}
270
+
271
+ def handle_call(:balance, _from, balance) do
272
+ {:reply, balance, balance}
273
+ end
274
+
275
+ def handle_cast({:deposit, amount}, balance) do
276
+ {:noreply, balance + amount}
277
+ end
278
+ end
279
+ ```
280
+
281
+ ### Task による非同期処理
282
+
283
+ ```elixir
284
+ tasks = Enum.map(urls, fn url ->
285
+ Task.async(fn -> fetch(url) end)
286
+ end)
287
+
288
+ results = Enum.map(tasks, &Task.await/1)
289
+ ```
290
+
291
+ Strategy パターンの「振る舞いの切り替え」は、Elixir ではプロセスの切り替えやメッセージパッシングのパターンとして表現されます。
292
+
293
+ ## 6. まとめ
294
+
295
+ Strategy パターンは、関数型プログラミングで**最もシンプルに表現される** GoF パターンの一つです:
296
+
297
+ 1. **関数が戦略**: 高階関数の引数として戦略を渡すだけ
298
+ 2. **関数合成で戦略合成**: `comp` / `andThen` / `>>` / `.` で自然に合成
299
+ 3. **クロージャで状態管理**: パラメータ化された戦略はクロージャで表現
300
+
301
+ ## 言語別個別記事
302
+
303
+ - [Clojure](../clojure/10-strategy-pattern.md) | [Scala](../scala/10-strategy-pattern.md) | [Elixir](../elixir/10-concurrency-patterns.md) | [F#](../fsharp/10-strategy-pattern.md) | [Haskell](../haskell/10-strategy-pattern.md) | [Rust](../rust/10-strategy-pattern.md)