@k2works/claude-code-booster 2.7.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
  2. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
  3. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
  4. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
  5. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
  24. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
  25. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
  26. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
  27. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
  28. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
  47. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
  48. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
  49. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
  50. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
  51. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
  70. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
  71. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
  72. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
  73. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
  74. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
  93. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
  94. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
  95. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
  96. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
  97. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
  116. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
  117. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
  118. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
  119. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
  120. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
  121. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
  163. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
  164. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
  165. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
  166. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
  167. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
  168. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
  169. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
  170. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
  171. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
  172. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
  173. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
  174. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
  175. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
  176. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
  177. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
  178. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
  179. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
  180. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
  181. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
  182. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
  183. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
  184. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
  185. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
  186. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
  187. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
  188. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
  189. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
  190. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
  191. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
  192. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
  193. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
  194. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
  195. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
  196. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
  197. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
  198. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
  199. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
  200. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
  201. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
  202. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
  203. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
  204. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
  205. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
  206. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
  207. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
  208. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
  209. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
  210. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
  211. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
  212. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
  213. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
  214. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
  215. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
  216. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
  217. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
  218. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
  219. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
  220. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
  221. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
  222. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
  223. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
  224. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
  225. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
  226. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
  227. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
  228. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
  229. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
  230. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
  231. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
  232. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
  233. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
  234. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
  235. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
  236. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
  237. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
  238. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
  239. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
  240. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
  241. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
  242. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
  243. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
  244. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
  245. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
  246. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
  247. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
  248. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
  249. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
  250. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
  251. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
  252. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
  253. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
  254. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
  255. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
  256. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
  257. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
  258. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
  259. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
  260. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
  261. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
  262. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
  263. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
  264. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
  265. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
  266. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
  267. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
  268. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
  269. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
  270. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
  271. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
  272. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
  273. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
  274. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
  275. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
  276. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
  277. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
  278. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
  279. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
  280. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
  281. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
  282. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
  283. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
  284. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
  285. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
  286. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
  287. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
  288. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
  289. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
  290. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
  291. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
  292. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
  293. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
  294. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
  295. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
  296. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
  297. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
  298. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
  299. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
  300. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
  301. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
  302. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
  303. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
  304. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
  305. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
  306. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
  307. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
  308. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
  309. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
  310. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
  311. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
  312. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
  313. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
  314. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
  315. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
  316. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
  317. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
  318. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
  319. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
  320. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
  321. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
  322. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
  323. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
  324. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
  325. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
  326. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
  327. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
  328. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
  329. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
  330. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
  331. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
  332. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
  333. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
  334. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
  335. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
  336. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
  337. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
  338. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
  339. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
  340. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
  341. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
  342. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
  343. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
  344. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
  345. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
  346. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
  347. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
  348. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
  349. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
  350. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
  351. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
  352. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
  353. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
  354. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
  355. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
  356. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
  357. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
  358. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
  359. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
  360. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
  361. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
  362. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
  363. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
  364. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
  365. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
  366. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
  367. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
  368. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
  369. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
  370. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
  371. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
  372. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
  373. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
  374. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
  375. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
  376. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
  377. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
  378. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
  379. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
  380. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
  381. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
  382. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
  383. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
  384. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
  385. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
  386. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
  387. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
  388. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
  389. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
  390. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
  391. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
  392. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
  393. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
  394. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
  395. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
  396. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
  397. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
  398. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
  399. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
  400. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
  401. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
  402. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
  403. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
  404. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
  405. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
  406. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
  407. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
  408. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
  409. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
  410. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
  411. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
  412. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
  413. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
  414. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
  415. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
  416. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
  417. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
  418. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
  419. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
  420. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
  421. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
  422. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
  423. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
  424. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
  425. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
  426. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
  427. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
  428. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
  429. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
  430. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
  431. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
  432. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
  433. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
  434. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
  435. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
  436. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
  437. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
  438. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
  439. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
  440. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
  441. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
  442. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
  443. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
  444. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
  445. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
  446. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
  447. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
  448. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
  449. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
  450. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
  451. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
  452. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
  453. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
  454. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
  455. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
  456. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
  457. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
  458. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
  459. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
  460. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
  461. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
  462. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
  463. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
  464. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
  465. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
  466. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
  467. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
  468. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
  469. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
  470. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
  471. package/lib/assets/docs/article/grokkingfp/index.md +143 -0
  472. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
  473. package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
  474. package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
  475. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
  476. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
  477. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
  478. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
  479. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
  480. package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
  481. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
  482. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
  483. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
  484. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
  485. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
  486. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
  487. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
  488. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
  489. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
  490. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
  491. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
  492. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
  493. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
  494. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
  495. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
  496. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
  497. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
  498. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
  499. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
  500. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
  501. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
  502. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
  503. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
  504. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
  505. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
  506. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
  507. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
  508. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
  509. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
  510. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
  511. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
  512. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
  513. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
  514. package/lib/assets/docs/article/index.md +36 -0
  515. package/lib/assets/docs/design/index.md +39 -27
  516. package/lib/assets/docs/development/index.md +11 -1
  517. package/lib/assets/docs/index.md +33 -103
  518. package/lib/assets/docs/operation/index.md +16 -6
  519. package/lib/assets/docs/reference/index.md +5 -4
  520. package/lib/assets/docs/requirements/index.md +13 -6
  521. package/lib/assets/docs/review/index.md +5 -0
  522. package/lib/assets/docs/strategy/index.md +15 -0
  523. package/lib/assets/docs/template/index.md +9 -5
  524. package/lib/assets/mkdocs.yml +33 -19
  525. package/package.json +1 -1
  526. package/lib/assets/docs/analysis/index.md +0 -8
  527. /package/lib/assets/docs/{analysis → strategy}/slide/.gitkeep +0 -0
@@ -0,0 +1,319 @@
1
+ # 第13章: Abstract Factory パターン — 6言語統合ガイド
2
+
3
+ ## 1. はじめに
4
+
5
+ Abstract Factory パターンは、関連するオブジェクトのファミリーを一貫した方法で生成する GoF パターンです。OOP ではファクトリインターフェースと具象ファクトリクラスを用いますが、関数型プログラミングでは**ファクトリ関数のレコード / マップ / モジュール**として表現されます。スタイル付き図形、プラットフォーム別 UI、データベースアダプターなどの生成を統一的に管理します。
6
+
7
+ ## 2. 共通の本質
8
+
9
+ ### Abstract Factory の構造
10
+
11
+ ```
12
+ Factory = { createA: params → A, createB: params → B }
13
+ ```
14
+
15
+ - **製品ファミリー**: 一貫したスタイル/テーマの製品群を生成
16
+ - **ファクトリの差し替え**: 実行時にファクトリを切り替えて製品群を変更
17
+ - **一貫性の保証**: 同じファクトリから生成された製品は互いに整合
18
+
19
+ ### 典型的なユースケース
20
+
21
+ - **図形ファクトリ**: Standard / Outlined / Filled スタイルの図形生成
22
+ - **UI ファクトリ**: Windows / Mac / Linux 向けのコンポーネント生成
23
+ - **データベースファクトリ**: MySQL / PostgreSQL / SQLite の接続生成
24
+
25
+ ## 3. 言語別実装比較
26
+
27
+ ### 3.1 ファクトリの表現方法
28
+
29
+ | 言語 | ファクトリ表現 | 製品の表現 |
30
+ |------|-------------|----------|
31
+ | Clojure | 関数のマップ / マルチメソッド | マップ |
32
+ | Scala | trait + object | case class |
33
+ | Elixir | プロトコル + 構造体 | 構造体 |
34
+ | F# | 判別共用体 / 関数レコード | レコード |
35
+ | Haskell | 型クラス / 関数レコード | ADT |
36
+ | Rust | trait + struct | struct |
37
+
38
+ ### 3.2 図形ファクトリ
39
+
40
+ <details>
41
+ <summary>Scala: trait + object</summary>
42
+
43
+ ```scala
44
+ trait ShapeFactory:
45
+ def createCircle(center: Point, radius: Double): Shape
46
+ def createSquare(topLeft: Point, side: Double): Shape
47
+ def createRectangle(topLeft: Point, width: Double, height: Double): Shape
48
+
49
+ object StandardShapeFactory extends ShapeFactory:
50
+ def createCircle(center: Point, radius: Double): Shape =
51
+ Circle(center, radius)
52
+ def createSquare(topLeft: Point, side: Double): Shape =
53
+ Square(topLeft, side)
54
+ def createRectangle(topLeft: Point, w: Double, h: Double): Shape =
55
+ Rectangle(topLeft, w, h)
56
+
57
+ object OutlinedShapeFactory extends ShapeFactory:
58
+ def createCircle(center: Point, radius: Double): Shape =
59
+ StyledShape(Circle(center, radius), Style(outline = true, color = "black"))
60
+ // ...
61
+ ```
62
+
63
+ </details>
64
+
65
+ <details>
66
+ <summary>Haskell: 型クラス</summary>
67
+
68
+ ```haskell
69
+ class ShapeFactory f where
70
+ createCircle :: f -> Point -> Double -> Shape
71
+ createSquare :: f -> Point -> Double -> Shape
72
+ createRectangle :: f -> Point -> Double -> Double -> Shape
73
+
74
+ data StandardFactory = StandardFactory
75
+ data OutlinedFactory = OutlinedFactory String Float
76
+
77
+ instance ShapeFactory StandardFactory where
78
+ createCircle _ center radius = Circle center radius
79
+ createSquare _ topLeft side = Square topLeft side
80
+ createRectangle _ tl w h = Rectangle tl w h
81
+
82
+ instance ShapeFactory OutlinedFactory where
83
+ createCircle (OutlinedFactory color width) center radius =
84
+ StyledShape (Circle center radius) (Style color width)
85
+ -- ...
86
+ ```
87
+
88
+ </details>
89
+
90
+ <details>
91
+ <summary>F#: 判別共用体によるファクトリ選択</summary>
92
+
93
+ ```fsharp
94
+ type ShapeFactory =
95
+ | Standard
96
+ | Outlined of color: string * width: float
97
+ | Filled of color: string
98
+
99
+ module ShapeFactory =
100
+ let createCircle (factory: ShapeFactory) (center: Point) (radius: float) =
101
+ let baseShape = Circle(center, radius)
102
+ match factory with
103
+ | Standard -> baseShape
104
+ | Outlined(color, width) ->
105
+ StyledShape(baseShape, { OutlineColor = color; OutlineWidth = width })
106
+ | Filled(color) ->
107
+ StyledShape(baseShape, { FillColor = color })
108
+
109
+ let createSquare (factory: ShapeFactory) (topLeft: Point) (side: float) =
110
+ let baseShape = Square(topLeft, side)
111
+ match factory with
112
+ | Standard -> baseShape
113
+ | Outlined(color, width) ->
114
+ StyledShape(baseShape, { OutlineColor = color; OutlineWidth = width })
115
+ | Filled(color) ->
116
+ StyledShape(baseShape, { FillColor = color })
117
+ ```
118
+
119
+ </details>
120
+
121
+ <details>
122
+ <summary>Rust: trait + struct</summary>
123
+
124
+ ```rust
125
+ pub trait ShapeFactory {
126
+ fn create_circle(&self, center: Point, radius: f64) -> Shape;
127
+ fn create_square(&self, top_left: Point, side: f64) -> Shape;
128
+ }
129
+
130
+ pub struct StandardFactory;
131
+
132
+ impl ShapeFactory for StandardFactory {
133
+ fn create_circle(&self, center: Point, radius: f64) -> Shape {
134
+ Shape::Circle { center, radius }
135
+ }
136
+ fn create_square(&self, top_left: Point, side: f64) -> Shape {
137
+ Shape::Square { top_left, side }
138
+ }
139
+ }
140
+
141
+ pub struct OutlinedFactory {
142
+ pub color: String,
143
+ pub width: f64,
144
+ }
145
+
146
+ impl ShapeFactory for OutlinedFactory {
147
+ fn create_circle(&self, center: Point, radius: f64) -> Shape {
148
+ Shape::Styled {
149
+ shape: Box::new(Shape::Circle { center, radius }),
150
+ style: Style { outline_color: self.color.clone(), outline_width: self.width },
151
+ }
152
+ }
153
+ // ...
154
+ }
155
+ ```
156
+
157
+ </details>
158
+
159
+ <details>
160
+ <summary>Clojure: 関数のマップ</summary>
161
+
162
+ ```clojure
163
+ (def standard-factory
164
+ {:create-circle (fn [center radius]
165
+ {:type :circle :center center :radius radius})
166
+ :create-square (fn [top-left side]
167
+ {:type :square :top-left top-left :side side})})
168
+
169
+ (def outlined-factory
170
+ {:create-circle (fn [center radius]
171
+ {:type :styled-shape
172
+ :shape {:type :circle :center center :radius radius}
173
+ :style {:outline true :color "black"}})
174
+ :create-square (fn [top-left side]
175
+ {:type :styled-shape
176
+ :shape {:type :square :top-left top-left :side side}
177
+ :style {:outline true :color "black"}})})
178
+
179
+ ;; ファクトリの利用
180
+ (defn draw-scene [factory]
181
+ (let [circle ((:create-circle factory) {:x 0 :y 0} 5)
182
+ square ((:create-square factory) {:x 10 :y 10} 3)]
183
+ [circle square]))
184
+ ```
185
+
186
+ </details>
187
+
188
+ <details>
189
+ <summary>Elixir: プロトコル + 構造体</summary>
190
+
191
+ ```elixir
192
+ defprotocol ShapeFactory do
193
+ def create_circle(factory, center, radius)
194
+ def create_square(factory, top_left, side)
195
+ end
196
+
197
+ defmodule StandardShapeFactory do
198
+ defstruct []
199
+ end
200
+
201
+ defimpl ShapeFactory, for: StandardShapeFactory do
202
+ def create_circle(_factory, center, radius) do
203
+ %Circle{center: center, radius: radius}
204
+ end
205
+
206
+ def create_square(_factory, top_left, side) do
207
+ %Square{top_left: top_left, side: side}
208
+ end
209
+ end
210
+
211
+ defmodule OutlinedShapeFactory do
212
+ defstruct [:outline_color, :outline_width]
213
+ end
214
+
215
+ defimpl ShapeFactory, for: OutlinedShapeFactory do
216
+ def create_circle(factory, center, radius) do
217
+ %StyledShape{
218
+ shape: %Circle{center: center, radius: radius},
219
+ style: %{color: factory.outline_color, width: factory.outline_width}
220
+ }
221
+ end
222
+ # ...
223
+ end
224
+ ```
225
+
226
+ </details>
227
+
228
+ ### 3.3 UI ファクトリ(プラットフォーム別)
229
+
230
+ <details>
231
+ <summary>プラットフォーム別 UI 生成の比較</summary>
232
+
233
+ ```rust
234
+ // Rust
235
+ pub trait GUIFactory {
236
+ fn create_button(&self, label: &str) -> Box<dyn Button>;
237
+ fn create_checkbox(&self, label: &str, checked: bool) -> Box<dyn Checkbox>;
238
+ }
239
+
240
+ pub struct WindowsFactory;
241
+ pub struct MacFactory;
242
+
243
+ impl GUIFactory for WindowsFactory {
244
+ fn create_button(&self, label: &str) -> Box<dyn Button> {
245
+ Box::new(WindowsButton { label: label.to_string() })
246
+ }
247
+ // ...
248
+ }
249
+ ```
250
+
251
+ ```scala
252
+ // Scala
253
+ trait GUIFactory:
254
+ def createButton(label: String): Button
255
+ def createCheckbox(label: String, checked: Boolean): Checkbox
256
+
257
+ object WindowsFactory extends GUIFactory:
258
+ def createButton(label: String) = WindowsButton(label)
259
+ def createCheckbox(label: String, checked: Boolean) = WindowsCheckbox(label, checked)
260
+
261
+ object MacFactory extends GUIFactory:
262
+ def createButton(label: String) = MacButton(label)
263
+ def createCheckbox(label: String, checked: Boolean) = MacCheckbox(label, checked)
264
+ ```
265
+
266
+ </details>
267
+
268
+ ## 4. 比較分析
269
+
270
+ ### 4.1 ファクトリの抽象化レベル
271
+
272
+ | 言語 | 抽象化方法 | 切り替えの容易さ |
273
+ |------|----------|---------------|
274
+ | Clojure | マップの差し替え | 最も柔軟(動的) |
275
+ | Scala | trait の実装切り替え | 型安全に切り替え |
276
+ | Elixir | プロトコル実装の差し替え | プロトコルベースで柔軟 |
277
+ | F# | 判別共用体のパターンマッチ | コンパイル時に網羅性保証 |
278
+ | Haskell | 型クラスインスタンスの選択 | 型推論で自動選択 |
279
+ | Rust | trait object の差し替え | `Box<dyn Factory>` で動的 |
280
+
281
+ ### 4.2 OOP Abstract Factory vs 関数型
282
+
283
+ | 観点 | OOP | 関数型 |
284
+ |------|-----|--------|
285
+ | ファクトリ | インターフェース + 実装クラス | 関数のレコード / 型クラス / trait |
286
+ | 製品 | 具象クラス | ADT / enum / マップ |
287
+ | 拡張 | 新クラス追加 | 新しいインスタンス / 判別共用体追加 |
288
+ | 依存性注入 | コンストラクタ | 関数引数 |
289
+
290
+ ### 4.3 Elixir 版のボリューム
291
+
292
+ Elixir 版は 604 行と最も長い記事です。これは以下の理由によります:
293
+
294
+ - 3-4 種類のファクトリ(Standard, Outlined, Filled, Complex)の完全実装
295
+ - UI ファクトリ(Windows, Mac, Linux)の詳細例
296
+ - データベースファクトリの追加例
297
+ - 各ファクトリのテストコードと使用例
298
+
299
+ ## 5. 実践的な選択指針
300
+
301
+ | 要件 | 推奨言語 | 理由 |
302
+ |------|---------|------|
303
+ | 動的なファクトリ切り替え | Clojure | マップベースで最も柔軟 |
304
+ | 型安全なファクトリ | Haskell | 型クラスで自動推論 |
305
+ | プラットフォーム別 UI | Rust, Scala | trait ベースの具象ファクトリ |
306
+ | コンパイル時の網羅性保証 | F# | 判別共用体でファクトリ種別を管理 |
307
+ | プロトコルベースの拡張 | Elixir | 既存型に後からファクトリ実装を追加 |
308
+
309
+ ## 6. まとめ
310
+
311
+ Abstract Factory パターンは、関数型プログラミングで以下のように表現されます:
312
+
313
+ 1. **ファクトリ = 関数の集合**: 生成関数をレコード / マップ / 型クラスでまとめる
314
+ 2. **製品ファミリーの一貫性**: 同じファクトリから生成された製品は整合する
315
+ 3. **差し替え可能性**: ファクトリを引数として渡すことで実行時に切り替え
316
+
317
+ ## 言語別個別記事
318
+
319
+ - [Clojure](../clojure/13-abstract-factory-pattern.md) | [Scala](../scala/13-abstract-factory-pattern.md) | [Elixir](../elixir/13-abstract-factory-pattern.md) | [F#](../fsharp/13-abstract-factory-pattern.md) | [Haskell](../haskell/13-abstract-factory-pattern.md) | [Rust](../rust/13-abstract-factory-pattern.md)
@@ -0,0 +1,365 @@
1
+ # 第14章: Abstract Server パターン — 6言語統合ガイド
2
+
3
+ ## 1. はじめに
4
+
5
+ Abstract Server パターンは、SOLID 原則の**依存性逆転の原則(DIP)**を実現するパターンです。高レベルモジュールが低レベルモジュールに直接依存するのではなく、**抽象(インターフェース)**に依存することで、実装の差し替えを可能にします。関数型プログラミングでは、型クラス・trait・プロトコル・高階関数がこの抽象化を提供します。
6
+
7
+ ## 2. 共通の本質
8
+
9
+ ### DIP の構造
10
+
11
+ ```
12
+ 高レベルモジュール(Client)
13
+ ↓ 依存
14
+ 抽象(Interface)
15
+ ↑ 実装
16
+ 低レベルモジュール(Server)
17
+ ```
18
+
19
+ - **Client**: 抽象に依存し、具体的な実装を知らない
20
+ - **Interface**: 操作の契約を定義
21
+ - **Server**: 抽象を実装する具体的なモジュール
22
+
23
+ ### 典型的なユースケース
24
+
25
+ - **Switchable デバイス**: Switch(Client)→ Switchable(Interface)→ Light/Fan/Motor(Server)
26
+ - **リポジトリ**: Service → Repository → InMemory / Database
27
+ - **ロガー**: Application → Logger → Console / File / Test
28
+
29
+ ## 3. 言語別実装比較
30
+
31
+ ### 3.1 抽象インターフェースの表現
32
+
33
+ | 言語 | 抽象の表現 | DIP の実現 |
34
+ |------|----------|----------|
35
+ | Clojure | プロトコル(`defprotocol`) | プロトコル実装の差し替え |
36
+ | Scala | trait / given | 型クラスインスタンスの選択 |
37
+ | Elixir | プロトコル / `@behaviour` | `defimpl` / `@behaviour` 実装 |
38
+ | F# | インターフェース | インターフェース実装の差し替え |
39
+ | Haskell | 型クラス(`class`) | インスタンスの選択 |
40
+ | Rust | trait | trait 実装の差し替え |
41
+
42
+ ### 3.2 Switchable パターン
43
+
44
+ すべての言語で共通する典型例:Switch(Client)が Switchable(Interface)に依存し、Light / Fan / Motor(Server)が Switchable を実装します。
45
+
46
+ <details>
47
+ <summary>Clojure: プロトコル + レコード</summary>
48
+
49
+ ```clojure
50
+ (defprotocol Switchable
51
+ (turn-on [this])
52
+ (turn-off [this])
53
+ (is-on? [this]))
54
+
55
+ (defrecord Light [state]
56
+ Switchable
57
+ (turn-on [this] (assoc this :state :on))
58
+ (turn-off [this] (assoc this :state :off))
59
+ (is-on? [this] (= (:state this) :on)))
60
+
61
+ (defrecord Fan [state speed]
62
+ Switchable
63
+ (turn-on [this] (assoc this :state :on :speed :low))
64
+ (turn-off [this] (assoc this :state :off :speed nil))
65
+ (is-on? [this] (= (:state this) :on)))
66
+
67
+ ;; Client: Switch は Switchable にのみ依存
68
+ (defn toggle [device]
69
+ (if (is-on? device) (turn-off device) (turn-on device)))
70
+ ```
71
+
72
+ </details>
73
+
74
+ <details>
75
+ <summary>Scala: given + 型クラス</summary>
76
+
77
+ ```scala
78
+ trait Switchable[A]:
79
+ def turnOn(device: A): A
80
+ def turnOff(device: A): A
81
+ def isOn(device: A): Boolean
82
+
83
+ case class Light(state: LightState = LightState.Off)
84
+
85
+ given Switchable[Light] with
86
+ def turnOn(light: Light): Light = light.copy(state = LightState.On)
87
+ def turnOff(light: Light): Light = light.copy(state = LightState.Off)
88
+ def isOn(light: Light): Boolean = light.state == LightState.On
89
+
90
+ // Client: 型クラス制約で抽象に依存
91
+ def toggle[A: Switchable](device: A): A =
92
+ val sw = summon[Switchable[A]]
93
+ if sw.isOn(device) then sw.turnOff(device) else sw.turnOn(device)
94
+ ```
95
+
96
+ </details>
97
+
98
+ <details>
99
+ <summary>Haskell: 型クラス</summary>
100
+
101
+ ```haskell
102
+ class Switchable a where
103
+ turnOn :: a -> a
104
+ turnOff :: a -> a
105
+ isOn :: a -> Bool
106
+
107
+ data Light = Light { lightState :: SwitchState, lightName :: String }
108
+ deriving (Show, Eq)
109
+
110
+ instance Switchable Light where
111
+ turnOn light = light { lightState = On }
112
+ turnOff light = light { lightState = Off }
113
+ isOn light = lightState light == On
114
+
115
+ data Fan = Fan { fanState :: SwitchState, fanSpeed :: Maybe Speed }
116
+ deriving (Show, Eq)
117
+
118
+ instance Switchable Fan where
119
+ turnOn fan = fan { fanState = On, fanSpeed = Just Low }
120
+ turnOff fan = fan { fanState = Off, fanSpeed = Nothing }
121
+ isOn fan = fanState fan == On
122
+
123
+ -- Client: 型クラス制約で抽象に依存
124
+ toggle :: Switchable a => a -> a
125
+ toggle device = if isOn device then turnOff device else turnOn device
126
+ ```
127
+
128
+ </details>
129
+
130
+ <details>
131
+ <summary>Rust: trait</summary>
132
+
133
+ ```rust
134
+ pub trait Switchable {
135
+ fn turn_on(&self) -> Self;
136
+ fn turn_off(&self) -> Self;
137
+ fn is_on(&self) -> bool;
138
+ }
139
+
140
+ pub struct Light { pub state: bool }
141
+
142
+ impl Switchable for Light {
143
+ fn turn_on(&self) -> Self { Light { state: true } }
144
+ fn turn_off(&self) -> Self { Light { state: false } }
145
+ fn is_on(&self) -> bool { self.state }
146
+ }
147
+
148
+ pub struct Fan { pub state: bool, pub speed: Option<Speed> }
149
+
150
+ impl Switchable for Fan {
151
+ fn turn_on(&self) -> Self {
152
+ Fan { state: true, speed: Some(Speed::Low) }
153
+ }
154
+ fn turn_off(&self) -> Self {
155
+ Fan { state: false, speed: None }
156
+ }
157
+ fn is_on(&self) -> bool { self.state }
158
+ }
159
+
160
+ // Client: ジェネリクス + trait 境界
161
+ pub fn toggle<T: Switchable>(device: &T) -> T {
162
+ if device.is_on() { device.turn_off() } else { device.turn_on() }
163
+ }
164
+ ```
165
+
166
+ </details>
167
+
168
+ <details>
169
+ <summary>F#: インターフェース</summary>
170
+
171
+ ```fsharp
172
+ type ISwitchable =
173
+ abstract member TurnOn: unit -> ISwitchable
174
+ abstract member TurnOff: unit -> ISwitchable
175
+ abstract member IsOn: bool
176
+
177
+ type Light = { State: bool }
178
+ with
179
+ interface ISwitchable with
180
+ member this.TurnOn() = { State = true } :> ISwitchable
181
+ member this.TurnOff() = { State = false } :> ISwitchable
182
+ member this.IsOn = this.State
183
+
184
+ // Client
185
+ let toggle (device: ISwitchable) =
186
+ if device.IsOn then device.TurnOff() else device.TurnOn()
187
+ ```
188
+
189
+ </details>
190
+
191
+ <details>
192
+ <summary>Elixir: プロトコル</summary>
193
+
194
+ ```elixir
195
+ defprotocol Switchable do
196
+ def turn_on(device)
197
+ def turn_off(device)
198
+ def on?(device)
199
+ end
200
+
201
+ defmodule Light do
202
+ defstruct state: :off, brightness: 100
203
+ end
204
+
205
+ defimpl Switchable, for: Light do
206
+ def turn_on(light), do: %{light | state: :on}
207
+ def turn_off(light), do: %{light | state: :off}
208
+ def on?(%Light{state: state}), do: state == :on
209
+ end
210
+
211
+ # Client
212
+ defmodule Switch do
213
+ def toggle(device) do
214
+ if Switchable.on?(device),
215
+ do: Switchable.turn_off(device),
216
+ else: Switchable.turn_on(device)
217
+ end
218
+ end
219
+ ```
220
+
221
+ </details>
222
+
223
+ ### 3.3 リポジトリパターン(DIP の実践)
224
+
225
+ データ永続化の抽象化は DIP の代表的な活用例です。
226
+
227
+ <details>
228
+ <summary>リポジトリの抽象化比較</summary>
229
+
230
+ ```haskell
231
+ -- Haskell: 型クラス
232
+ class Repository m where
233
+ save :: Entity -> m ()
234
+ findById :: String -> m (Maybe Entity)
235
+ findAll :: m [Entity]
236
+
237
+ -- インメモリ実装
238
+ instance Repository (State (Map String Entity)) where
239
+ save entity = modify (Map.insert (entityId entity) entity)
240
+ findById id = gets (Map.lookup id)
241
+ findAll = gets Map.elems
242
+ ```
243
+
244
+ ```rust
245
+ // Rust: trait
246
+ pub trait Repository<T> {
247
+ fn save(&mut self, entity: T) -> Result<(), String>;
248
+ fn find_by_id(&self, id: &str) -> Option<&T>;
249
+ fn find_all(&self) -> Vec<&T>;
250
+ }
251
+
252
+ pub struct InMemoryRepository<T> {
253
+ store: HashMap<String, T>,
254
+ }
255
+
256
+ impl<T: HasId> Repository<T> for InMemoryRepository<T> {
257
+ fn save(&mut self, entity: T) -> Result<(), String> {
258
+ self.store.insert(entity.id().to_string(), entity);
259
+ Ok(())
260
+ }
261
+ fn find_by_id(&self, id: &str) -> Option<&T> {
262
+ self.store.get(id)
263
+ }
264
+ fn find_all(&self) -> Vec<&T> {
265
+ self.store.values().collect()
266
+ }
267
+ }
268
+ ```
269
+
270
+ ```scala
271
+ // Scala: trait
272
+ trait Repository[T]:
273
+ def save(entity: T): Unit
274
+ def findById(id: String): Option[T]
275
+ def findAll: List[T]
276
+
277
+ class InMemoryRepository[T] extends Repository[T]:
278
+ private val store = scala.collection.mutable.Map.empty[String, T]
279
+ def save(entity: T): Unit = store += (entity.id -> entity)
280
+ def findById(id: String): Option[T] = store.get(id)
281
+ def findAll: List[T] = store.values.toList
282
+ ```
283
+
284
+ </details>
285
+
286
+ ### 3.4 ロガーパターン
287
+
288
+ テスト可能なロギングの抽象化です。
289
+
290
+ | 言語 | 本番用 | テスト用 |
291
+ |------|--------|---------|
292
+ | Clojure | `println` を呼ぶ実装 | `atom` に蓄積する実装 |
293
+ | Scala | `ConsoleLogger` | `TestLogger`(`var` で蓄積) |
294
+ | Elixir | `ConsoleLogger` | `TestLogger`(Agent で蓄積) |
295
+ | F# | `ConsoleLogger` | `TestLogger`(`ResizeArray` で蓄積) |
296
+ | Haskell | `IO` ベース | `Writer` モナドベース |
297
+ | Rust | `ConsoleLogger` | `TestLogger`(`Vec` で蓄積) |
298
+
299
+ ## 4. 比較分析
300
+
301
+ ### 4.1 DIP の実現レベル
302
+
303
+ | 言語 | DIP の強制力 | コンパイル時チェック |
304
+ |------|-----------|-----------------|
305
+ | Clojure | 規約ベース | なし |
306
+ | Scala | 型クラス / given で強制 | 完全 |
307
+ | Elixir | プロトコルで強制 | なし(動的) |
308
+ | F# | インターフェースで強制 | 完全 |
309
+ | Haskell | 型クラスで強制 | 最も厳密 |
310
+ | Rust | trait 境界で強制 | 完全 |
311
+
312
+ ### 4.2 高階関数による簡易 DIP
313
+
314
+ 型クラスや trait を使わなくても、**高階関数**で簡易的に DIP を実現できます:
315
+
316
+ ```clojure
317
+ ;; Clojure: 関数を渡すだけ
318
+ (defn process [data save-fn log-fn]
319
+ (log-fn "Processing...")
320
+ (save-fn (transform data))
321
+ (log-fn "Done"))
322
+ ```
323
+
324
+ ```haskell
325
+ -- Haskell: 関数を渡す
326
+ process :: (String -> IO ()) -> (a -> IO ()) -> a -> IO ()
327
+ process logger saver data = do
328
+ logger "Processing..."
329
+ saver (transform data)
330
+ logger "Done"
331
+ ```
332
+
333
+ この方法は小規模なケースでは十分ですが、操作が多数ある場合は型クラス / trait / プロトコルの方が整理しやすくなります。
334
+
335
+ ### 4.3 Elixir 版のボリューム
336
+
337
+ Elixir 版は 729 行と全言語中最長です。これは以下を詳細に扱っているためです:
338
+
339
+ - Light / Fan / Motor の 3 種類のデバイス実装
340
+ - Repository パターン(User, Product)の完全実装
341
+ - Logger インターフェースの複数実装
342
+ - 複合サービスの統合例
343
+ - 各パターンのテストコード
344
+
345
+ ## 5. 実践的な選択指針
346
+
347
+ | 要件 | 推奨言語 | 理由 |
348
+ |------|---------|------|
349
+ | 最も厳密な DIP | Haskell | 型クラスによるコンパイル時強制 |
350
+ | 実用的な DIP | Rust, Scala | trait / given で型安全に抽象化 |
351
+ | 動的な実装切り替え | Clojure | プロトコル + 高階関数で柔軟 |
352
+ | アクターモデルとの統合 | Elixir | プロトコル + GenServer で状態管理 |
353
+ | .NET エコシステム統合 | F# | インターフェースで C# と相互運用 |
354
+
355
+ ## 6. まとめ
356
+
357
+ Abstract Server パターンは、SOLID の DIP を関数型で実現する基盤です:
358
+
359
+ 1. **型クラス / trait / プロトコル**: 抽象インターフェースを言語の仕組みで表現
360
+ 2. **実装の差し替え**: テスト用モック、本番用実装を同じインターフェースで切り替え
361
+ 3. **高階関数による簡易 DIP**: 小規模なケースでは関数を渡すだけでも十分
362
+
363
+ ## 言語別個別記事
364
+
365
+ - [Clojure](../clojure/14-abstract-server-pattern.md) | [Scala](../scala/14-abstract-server-pattern.md) | [Elixir](../elixir/14-abstract-server-pattern.md) | [F#](../fsharp/14-abstract-server-pattern.md) | [Haskell](../haskell/14-abstract-server-pattern.md) | [Rust](../rust/14-abstract-server-pattern.md)