@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,339 @@
1
+ # 第12章: Visitor パターン
2
+
3
+ ## はじめに
4
+
5
+ Visitor パターンは、データ構造と操作を分離し、既存のデータ構造を変更することなく新しい操作を追加できるようにするパターンです。
6
+
7
+ 本章では、図形(Shape)に対する様々な操作(JSON 変換、XML 変換、面積計算、周囲長計算)を通じて、判別共用体とパターンマッチングによる Visitor パターンの実装を学びます。
8
+
9
+ ## 1. パターンの構造
10
+
11
+ Visitor パターンは以下の要素で構成されます:
12
+
13
+ - **Visitor**: 操作のインターフェース
14
+ - **ConcreteVisitor**: 具体的な操作の実装
15
+ - **Element**: 訪問される要素のインターフェース
16
+ - **ConcreteElement**: 具体的な要素
17
+
18
+ ```plantuml
19
+ @startuml
20
+ package "Elements (図形)" {
21
+ class "Circle" as circle
22
+ class "Square" as square
23
+ class "Rectangle" as rectangle
24
+ }
25
+
26
+ package "Visitors (操作)" {
27
+ class "JsonVisitor" as json
28
+ class "XmlVisitor" as xml
29
+ class "AreaVisitor" as area
30
+ class "PerimeterVisitor" as perimeter
31
+ }
32
+
33
+ json --> circle
34
+ json --> square
35
+ json --> rectangle
36
+ area --> circle
37
+ area --> square
38
+ area --> rectangle
39
+ @enduml
40
+ ```
41
+
42
+ ## 2. Element: 図形の定義
43
+
44
+ ### 判別共用体による図形定義
45
+
46
+ ```fsharp
47
+ [<RequireQualifiedAccess>]
48
+ type Shape =
49
+ | Circle of center: (float * float) * radius: float
50
+ | Square of topLeft: (float * float) * side: float
51
+ | Rectangle of topLeft: (float * float) * width: float * height: float
52
+ | Triangle of p1: (float * float) * p2: (float * float) * p3: (float * float)
53
+ ```
54
+
55
+ ### 図形の操作
56
+
57
+ ```fsharp
58
+ module Shape =
59
+ /// 図形を移動
60
+ let translate (dx: float) (dy: float) (shape: Shape) : Shape =
61
+ match shape with
62
+ | Shape.Circle((x, y), r) -> Shape.Circle((x + dx, y + dy), r)
63
+ | Shape.Square((x, y), s) -> Shape.Square((x + dx, y + dy), s)
64
+ | Shape.Rectangle((x, y), w, h) -> Shape.Rectangle((x + dx, y + dy), w, h)
65
+ | Shape.Triangle((x1, y1), (x2, y2), (x3, y3)) ->
66
+ Shape.Triangle((x1 + dx, y1 + dy), (x2 + dx, y2 + dy), (x3 + dx, y3 + dy))
67
+
68
+ /// 図形を拡大/縮小
69
+ let scale (factor: float) (shape: Shape) : Shape =
70
+ match shape with
71
+ | Shape.Circle(c, r) -> Shape.Circle(c, r * factor)
72
+ | Shape.Square(tl, s) -> Shape.Square(tl, s * factor)
73
+ | Shape.Rectangle(tl, w, h) -> Shape.Rectangle(tl, w * factor, h * factor)
74
+ // ...
75
+ ```
76
+
77
+ ## 3. Visitor: JSON 変換
78
+
79
+ ```fsharp
80
+ module JsonVisitor =
81
+ /// 図形を JSON 文字列に変換
82
+ let toJson (shape: Shape) : string =
83
+ match shape with
84
+ | Shape.Circle((x, y), r) ->
85
+ sprintf """{"type":"circle","center":[%g,%g],"radius":%g}""" x y r
86
+ | Shape.Square((x, y), s) ->
87
+ sprintf """{"type":"square","topLeft":[%g,%g],"side":%g}""" x y s
88
+ | Shape.Rectangle((x, y), w, h) ->
89
+ sprintf """{"type":"rectangle","topLeft":[%g,%g],"width":%g,"height":%g}""" x y w h
90
+ | Shape.Triangle((x1, y1), (x2, y2), (x3, y3)) ->
91
+ sprintf """{"type":"triangle","points":[[%g,%g],[%g,%g],[%g,%g]]}""" x1 y1 x2 y2 x3 y3
92
+
93
+ /// 複数の図形を JSON 配列に変換
94
+ let shapesToJson (shapes: Shape list) : string =
95
+ let jsonShapes = shapes |> List.map toJson |> String.concat ","
96
+ sprintf "[%s]" jsonShapes
97
+ ```
98
+
99
+ ### 使用例
100
+
101
+ ```fsharp
102
+ let circle = Shape.Circle((10.0, 20.0), 5.0)
103
+ let json = JsonVisitor.toJson circle
104
+ // => {"type":"circle","center":[10,20],"radius":5}
105
+ ```
106
+
107
+ ## 4. Visitor: XML 変換
108
+
109
+ ```fsharp
110
+ module XmlVisitor =
111
+ /// 図形を XML 文字列に変換
112
+ let toXml (shape: Shape) : string =
113
+ match shape with
114
+ | Shape.Circle((x, y), r) ->
115
+ sprintf """<circle><center x="%g" y="%g"/><radius>%g</radius></circle>""" x y r
116
+ | Shape.Square((x, y), s) ->
117
+ sprintf """<square><topLeft x="%g" y="%g"/><side>%g</side></square>""" x y s
118
+ | Shape.Rectangle((x, y), w, h) ->
119
+ sprintf """<rectangle><topLeft x="%g" y="%g"/><width>%g</width><height>%g</height></rectangle>""" x y w h
120
+ | Shape.Triangle((x1, y1), (x2, y2), (x3, y3)) ->
121
+ sprintf """<triangle><p1 x="%g" y="%g"/><p2 x="%g" y="%g"/><p3 x="%g" y="%g"/></triangle>""" x1 y1 x2 y2 x3 y3
122
+ ```
123
+
124
+ ## 5. Visitor: 面積計算
125
+
126
+ ```fsharp
127
+ module AreaVisitor =
128
+ /// 図形の面積を計算
129
+ let calculateArea (shape: Shape) : float =
130
+ match shape with
131
+ | Shape.Circle(_, r) -> System.Math.PI * r * r
132
+ | Shape.Square(_, s) -> s * s
133
+ | Shape.Rectangle(_, w, h) -> w * h
134
+ | Shape.Triangle((x1, y1), (x2, y2), (x3, y3)) ->
135
+ // ヘロンの公式
136
+ let a = sqrt((x2 - x1) ** 2.0 + (y2 - y1) ** 2.0)
137
+ let b = sqrt((x3 - x2) ** 2.0 + (y3 - y2) ** 2.0)
138
+ let c = sqrt((x1 - x3) ** 2.0 + (y1 - y3) ** 2.0)
139
+ let s = (a + b + c) / 2.0
140
+ sqrt(s * (s - a) * (s - b) * (s - c))
141
+
142
+ /// 複数の図形の合計面積を計算
143
+ let totalArea (shapes: Shape list) : float =
144
+ shapes |> List.sumBy calculateArea
145
+ ```
146
+
147
+ ## 6. Visitor: 周囲長計算
148
+
149
+ ```fsharp
150
+ module PerimeterVisitor =
151
+ /// 図形の周囲長を計算
152
+ let calculatePerimeter (shape: Shape) : float =
153
+ match shape with
154
+ | Shape.Circle(_, r) -> 2.0 * System.Math.PI * r
155
+ | Shape.Square(_, s) -> 4.0 * s
156
+ | Shape.Rectangle(_, w, h) -> 2.0 * (w + h)
157
+ | Shape.Triangle((x1, y1), (x2, y2), (x3, y3)) ->
158
+ let a = sqrt((x2 - x1) ** 2.0 + (y2 - y1) ** 2.0)
159
+ let b = sqrt((x3 - x2) ** 2.0 + (y3 - y2) ** 2.0)
160
+ let c = sqrt((x1 - x3) ** 2.0 + (y1 - y3) ** 2.0)
161
+ a + b + c
162
+ ```
163
+
164
+ ## 7. Visitor: バウンディングボックス計算
165
+
166
+ ```fsharp
167
+ type BoundingBox =
168
+ { MinX: float
169
+ MinY: float
170
+ MaxX: float
171
+ MaxY: float }
172
+
173
+ module BoundingBoxVisitor =
174
+ /// 図形のバウンディングボックスを計算
175
+ let calculateBoundingBox (shape: Shape) : BoundingBox =
176
+ match shape with
177
+ | Shape.Circle((x, y), r) ->
178
+ { MinX = x - r; MinY = y - r; MaxX = x + r; MaxY = y + r }
179
+ | Shape.Square((x, y), s) ->
180
+ { MinX = x; MinY = y; MaxX = x + s; MaxY = y + s }
181
+ | Shape.Rectangle((x, y), w, h) ->
182
+ { MinX = x; MinY = y; MaxX = x + w; MaxY = y + h }
183
+ // ...
184
+ ```
185
+
186
+ ## 8. Expression Visitor(式の評価)
187
+
188
+ ```fsharp
189
+ [<RequireQualifiedAccess>]
190
+ type Expr =
191
+ | Num of float
192
+ | Add of Expr * Expr
193
+ | Sub of Expr * Expr
194
+ | Mul of Expr * Expr
195
+ | Div of Expr * Expr
196
+ | Neg of Expr
197
+ | Var of string
198
+
199
+ module ExprVisitor =
200
+ /// 式を評価
201
+ let rec evaluate (env: Map<string, float>) (expr: Expr) : float =
202
+ match expr with
203
+ | Expr.Num n -> n
204
+ | Expr.Add(a, b) -> evaluate env a + evaluate env b
205
+ | Expr.Sub(a, b) -> evaluate env a - evaluate env b
206
+ | Expr.Mul(a, b) -> evaluate env a * evaluate env b
207
+ | Expr.Div(a, b) -> evaluate env a / evaluate env b
208
+ | Expr.Neg e -> -(evaluate env e)
209
+ | Expr.Var name -> Map.tryFind name env |> Option.defaultValue 0.0
210
+
211
+ /// 式を文字列に変換
212
+ let rec toString (expr: Expr) : string =
213
+ match expr with
214
+ | Expr.Num n -> sprintf "%g" n
215
+ | Expr.Add(a, b) -> sprintf "(%s + %s)" (toString a) (toString b)
216
+ // ...
217
+
218
+ /// 式を簡約
219
+ let rec simplify (expr: Expr) : Expr =
220
+ match expr with
221
+ | Expr.Add(Expr.Num 0.0, e) -> simplify e
222
+ | Expr.Mul(Expr.Num 1.0, e) -> simplify e
223
+ | Expr.Mul(Expr.Num 0.0, _) -> Expr.Num 0.0
224
+ // ...
225
+ ```
226
+
227
+ ### 使用例
228
+
229
+ ```fsharp
230
+ let expr = Expr.Add(Expr.Num 3.0, Expr.Mul(Expr.Num 2.0, Expr.Num 4.0))
231
+ let result = ExprVisitor.evaluate Map.empty expr
232
+ // => 11.0
233
+
234
+ let expr = Expr.Add(Expr.Var "x", Expr.Num 5.0)
235
+ let env = Map.ofList [ ("x", 10.0) ]
236
+ let result = ExprVisitor.evaluate env expr
237
+ // => 15.0
238
+ ```
239
+
240
+ ## 9. Tree Visitor
241
+
242
+ ```fsharp
243
+ type Tree<'T> =
244
+ | Leaf of 'T
245
+ | Node of Tree<'T> list
246
+
247
+ module TreeVisitor =
248
+ /// ツリーの全ての葉の値を収集
249
+ let rec collectLeaves (tree: Tree<'T>) : 'T list =
250
+ match tree with
251
+ | Leaf v -> [ v ]
252
+ | Node children -> children |> List.collect collectLeaves
253
+
254
+ /// ツリーの深さを計算
255
+ let rec depth (tree: Tree<'T>) : int =
256
+ match tree with
257
+ | Leaf _ -> 1
258
+ | Node [] -> 1
259
+ | Node children -> 1 + (children |> List.map depth |> List.max)
260
+
261
+ /// ツリーを変換
262
+ let rec map (f: 'T -> 'U) (tree: Tree<'T>) : Tree<'U> =
263
+ match tree with
264
+ | Leaf v -> Leaf(f v)
265
+ | Node children -> Node(children |> List.map (map f))
266
+
267
+ /// ツリーをフォールド
268
+ let rec fold (leafFn: 'T -> 'Acc) (nodeFn: 'Acc list -> 'Acc) (tree: Tree<'T>) : 'Acc =
269
+ match tree with
270
+ | Leaf v -> leafFn v
271
+ | Node children -> nodeFn (children |> List.map (fold leafFn nodeFn))
272
+ ```
273
+
274
+ ### 使用例
275
+
276
+ ```fsharp
277
+ let tree = Node [ Leaf 1; Node [ Leaf 2; Leaf 3 ]; Leaf 4 ]
278
+
279
+ let leaves = TreeVisitor.collectLeaves tree
280
+ // => [1; 2; 3; 4]
281
+
282
+ let d = TreeVisitor.depth tree
283
+ // => 3
284
+
285
+ let sum = TreeVisitor.fold id List.sum tree
286
+ // => 10
287
+ ```
288
+
289
+ ## 10. パターンの利点
290
+
291
+ 1. **操作の追加が容易**: 新しい Visitor を追加するだけで新しい操作を実装
292
+ 2. **単一責任の原則**: 各 Visitor は一つの操作に専念
293
+ 3. **関連する操作の一元化**: 同じ操作のコードが一箇所にまとまる
294
+ 4. **データ構造と操作の分離**: 要素クラスを変更せずに操作を追加
295
+
296
+ ## 11. 関数型プログラミングでの特徴
297
+
298
+ F# での Visitor パターンの実装には以下の特徴があります:
299
+
300
+ 1. **パターンマッチング**: 判別共用体と match 式で自然に実装
301
+ 2. **網羅性チェック**: コンパイラが全てのケースを処理しているか検証
302
+ 3. **再帰的データ構造**: 式やツリーなどの再帰的構造に最適
303
+ 4. **純粋関数**: 副作用のない変換処理
304
+ 5. **合成しやすさ**: 複数の Visitor を組み合わせ可能
305
+
306
+ ```fsharp
307
+ // パイプライン演算子を使った複数の操作
308
+ let shapes = [
309
+ Shape.Circle((0.0, 0.0), 5.0)
310
+ Shape.Square((10.0, 10.0), 10.0)
311
+ ]
312
+
313
+ let totalArea = AreaVisitor.totalArea shapes
314
+ let json = JsonVisitor.shapesToJson shapes
315
+ ```
316
+
317
+ ## まとめ
318
+
319
+ 本章では、Visitor パターンについて学びました:
320
+
321
+ 1. **図形の定義**: 判別共用体による Element の表現
322
+ 2. **JSON/XML 変換**: シリアライゼーション Visitor
323
+ 3. **面積/周囲長計算**: 数学的計算 Visitor
324
+ 4. **バウンディングボックス**: 空間計算 Visitor
325
+ 5. **式の評価**: 再帰的データ構造への Visitor
326
+ 6. **ツリー操作**: 汎用的なツリー Visitor
327
+
328
+ F# では、判別共用体とパターンマッチングにより、Visitor パターンを非常に自然に実装できます。
329
+
330
+ ## 参考コード
331
+
332
+ 本章のコード例は以下のファイルで確認できます:
333
+
334
+ - ソースコード: `apps/fsharp/part4/src/Library.fs`
335
+ - テストコード: `apps/fsharp/part4/tests/Tests.fs`
336
+
337
+ ## 次章予告
338
+
339
+ 次章では、**Abstract Factory パターン**について学びます。関連するオブジェクトのファミリーを生成するインターフェースを提供する方法を探ります。
@@ -0,0 +1,309 @@
1
+ # 第13章: Abstract Factory パターン
2
+
3
+ ## はじめに
4
+
5
+ Abstract Factory パターンは、関連するオブジェクトのファミリーを、その具体的なクラスを指定することなく生成するためのインターフェースを提供するパターンです。
6
+
7
+ 本章では、図形ファクトリ、UI ファクトリ、データベースファクトリなどの例を通じて、判別共用体による Abstract Factory パターンの実装を学びます。
8
+
9
+ ## 1. パターンの構造
10
+
11
+ Abstract Factory パターンは以下の要素で構成されます:
12
+
13
+ - **AbstractFactory**: オブジェクト生成の抽象インターフェース
14
+ - **ConcreteFactory**: 具体的なオブジェクトを生成するファクトリ
15
+ - **AbstractProduct**: 生成されるオブジェクトの抽象インターフェース
16
+ - **ConcreteProduct**: 具体的な製品
17
+
18
+ ```plantuml
19
+ @startuml
20
+ interface "AbstractFactory" as factory {
21
+ +createProductA()
22
+ +createProductB()
23
+ }
24
+
25
+ class "ConcreteFactory1" as factory1
26
+ class "ConcreteFactory2" as factory2
27
+
28
+ factory1 ..|> factory
29
+ factory2 ..|> factory
30
+ @enduml
31
+ ```
32
+
33
+ ## 2. 図形ファクトリ
34
+
35
+ ### スタイル情報の定義
36
+
37
+ ```fsharp
38
+ type ShapeStyle =
39
+ { OutlineColor: string option
40
+ OutlineWidth: float option
41
+ FillColor: string option
42
+ Opacity: float option }
43
+
44
+ module ShapeStyle =
45
+ let empty =
46
+ { OutlineColor = None
47
+ OutlineWidth = None
48
+ FillColor = None
49
+ Opacity = None }
50
+
51
+ let withOutline color width style =
52
+ { style with OutlineColor = Some color; OutlineWidth = Some width }
53
+
54
+ let withFill color style =
55
+ { style with FillColor = Some color }
56
+ ```
57
+
58
+ ### ファクトリの定義
59
+
60
+ ```fsharp
61
+ [<RequireQualifiedAccess>]
62
+ type ShapeFactory =
63
+ | Standard
64
+ | Outlined of color: string * width: float
65
+ | Filled of color: string
66
+ | Custom of style: ShapeStyle
67
+ ```
68
+
69
+ ### ファクトリの実装
70
+
71
+ ```fsharp
72
+ module ShapeFactory =
73
+ /// 円を作成
74
+ let createCircle (factory: ShapeFactory) (center: float * float) (radius: float) : StyledShape =
75
+ let shape = Shape.Circle(center, radius)
76
+ let style =
77
+ match factory with
78
+ | ShapeFactory.Standard -> ShapeStyle.empty
79
+ | ShapeFactory.Outlined(color, width) -> ShapeStyle.empty |> ShapeStyle.withOutline color width
80
+ | ShapeFactory.Filled color -> ShapeStyle.empty |> ShapeStyle.withFill color
81
+ | ShapeFactory.Custom style -> style
82
+ { Shape = shape; Style = style }
83
+ ```
84
+
85
+ ### 使用例
86
+
87
+ ```fsharp
88
+ // 標準ファクトリ
89
+ let standardFactory = ShapeFactory.Standard
90
+ let circle = ShapeFactory.createCircle standardFactory (10.0, 20.0) 5.0
91
+
92
+ // 輪郭線付きファクトリ
93
+ let outlinedFactory = ShapeFactory.Outlined("black", 2.0)
94
+ let square = ShapeFactory.createSquare outlinedFactory (0.0, 0.0) 10.0
95
+
96
+ // カスタムスタイルファクトリ
97
+ let customStyle =
98
+ ShapeStyle.empty
99
+ |> ShapeStyle.withOutline "blue" 3.0
100
+ |> ShapeStyle.withFill "yellow"
101
+ let customFactory = ShapeFactory.Custom customStyle
102
+ let rect = ShapeFactory.createRectangle customFactory (0.0, 0.0) 20.0 10.0
103
+ ```
104
+
105
+ ## 3. UI ファクトリ
106
+
107
+ ### コンポーネントの定義
108
+
109
+ ```fsharp
110
+ type Button =
111
+ { Label: string
112
+ Platform: string
113
+ Style: Map<string, string> }
114
+
115
+ type TextField =
116
+ { Placeholder: string
117
+ Platform: string
118
+ Style: Map<string, string> }
119
+
120
+ type Checkbox =
121
+ { Label: string
122
+ Checked: bool
123
+ Platform: string
124
+ Style: Map<string, string> }
125
+ ```
126
+
127
+ ### ファクトリの定義
128
+
129
+ ```fsharp
130
+ [<RequireQualifiedAccess>]
131
+ type UIFactory =
132
+ | Windows
133
+ | MacOS
134
+ | Linux
135
+ | Web
136
+ ```
137
+
138
+ ### ファクトリの実装
139
+
140
+ ```fsharp
141
+ module UIFactory =
142
+ /// ボタンを作成
143
+ let createButton (factory: UIFactory) (label: string) : Button =
144
+ let platform = match factory with
145
+ | UIFactory.Windows -> "windows"
146
+ | UIFactory.MacOS -> "macos"
147
+ | UIFactory.Linux -> "linux"
148
+ | UIFactory.Web -> "web"
149
+ let style = match factory with
150
+ | UIFactory.Windows -> Map.ofList [ ("border", "1px solid gray") ]
151
+ | UIFactory.MacOS -> Map.ofList [ ("borderRadius", "5px") ]
152
+ // ...
153
+ { Label = label; Platform = platform; Style = style }
154
+ ```
155
+
156
+ ### 使用例
157
+
158
+ ```fsharp
159
+ // Windows UI を作成
160
+ let windowsFactory = UIFactory.Windows
161
+ let okButton = UIFactory.createButton windowsFactory "OK"
162
+ let nameField = UIFactory.createTextField windowsFactory "Enter name"
163
+
164
+ // MacOS UI を作成
165
+ let macFactory = UIFactory.MacOS
166
+ let submitButton = UIFactory.createButton macFactory "Submit"
167
+ ```
168
+
169
+ ## 4. データベースファクトリ
170
+
171
+ ```fsharp
172
+ type DatabaseConnection =
173
+ { ConnectionString: string
174
+ DatabaseType: string
175
+ MaxPoolSize: int }
176
+
177
+ [<RequireQualifiedAccess>]
178
+ type DatabaseFactory =
179
+ | SqlServer of connectionString: string
180
+ | PostgreSQL of connectionString: string
181
+ | MySQL of connectionString: string
182
+ | SQLite of filePath: string
183
+
184
+ module DatabaseFactory =
185
+ let createConnection (factory: DatabaseFactory) : DatabaseConnection =
186
+ match factory with
187
+ | DatabaseFactory.SqlServer connStr ->
188
+ { ConnectionString = connStr
189
+ DatabaseType = "SqlServer"
190
+ MaxPoolSize = 100 }
191
+ | DatabaseFactory.PostgreSQL connStr ->
192
+ { ConnectionString = connStr
193
+ DatabaseType = "PostgreSQL"
194
+ MaxPoolSize = 50 }
195
+ | DatabaseFactory.SQLite path ->
196
+ { ConnectionString = sprintf "Data Source=%s" path
197
+ DatabaseType = "SQLite"
198
+ MaxPoolSize = 1 }
199
+ // ...
200
+ ```
201
+
202
+ ## 5. ドキュメントファクトリ
203
+
204
+ ```fsharp
205
+ [<RequireQualifiedAccess>]
206
+ type DocumentFactory =
207
+ | HTML
208
+ | Markdown
209
+ | PlainText
210
+
211
+ module DocumentFactory =
212
+ /// 段落を作成
213
+ let createParagraph (factory: DocumentFactory) (text: string) : string =
214
+ match factory with
215
+ | DocumentFactory.HTML -> sprintf "<p>%s</p>" text
216
+ | DocumentFactory.Markdown -> text + "\n"
217
+ | DocumentFactory.PlainText -> text + "\n"
218
+
219
+ /// 見出しを作成
220
+ let createHeading (factory: DocumentFactory) (level: int) (text: string) : string =
221
+ match factory with
222
+ | DocumentFactory.HTML -> sprintf "<h%d>%s</h%d>" level text level
223
+ | DocumentFactory.Markdown -> String.replicate level "#" + " " + text + "\n"
224
+ | DocumentFactory.PlainText -> text.ToUpper() + "\n"
225
+ ```
226
+
227
+ ## 6. テーマファクトリ
228
+
229
+ ```fsharp
230
+ type ThemeColors =
231
+ { Primary: string
232
+ Secondary: string
233
+ Background: string
234
+ Text: string }
235
+
236
+ type Theme =
237
+ { Name: string
238
+ Colors: ThemeColors
239
+ Fonts: ThemeFonts }
240
+
241
+ [<RequireQualifiedAccess>]
242
+ type ThemeFactory =
243
+ | Light
244
+ | Dark
245
+ | HighContrast
246
+
247
+ module ThemeFactory =
248
+ let createTheme (factory: ThemeFactory) : Theme =
249
+ match factory with
250
+ | ThemeFactory.Light ->
251
+ { Name = "Light"
252
+ Colors = { Primary = "#007bff"; Background = "#ffffff"; ... }
253
+ ... }
254
+ | ThemeFactory.Dark ->
255
+ { Name = "Dark"
256
+ Colors = { Primary = "#0d6efd"; Background = "#212529"; ... }
257
+ ... }
258
+ ```
259
+
260
+ ## 7. パターンの利点
261
+
262
+ 1. **製品ファミリーの一貫性**: 同じファクトリから生成された製品は互いに互換性がある
263
+ 2. **具体クラスの分離**: クライアントは具体的な製品クラスを知る必要がない
264
+ 3. **ファクトリの交換**: ファクトリを切り替えるだけで異なる製品ファミリーを使用可能
265
+ 4. **新しいファミリーの追加**: 新しいファクトリを追加するだけで新しい製品ファミリーに対応
266
+
267
+ ## 8. 関数型プログラミングでの特徴
268
+
269
+ F# での Abstract Factory パターンの実装には以下の特徴があります:
270
+
271
+ 1. **判別共用体**: ファクトリの種類を型安全に表現
272
+ 2. **パターンマッチング**: ファクトリの種類に応じた処理を明確に記述
273
+ 3. **モジュール関数**: ファクトリの操作を関数として定義
274
+ 4. **不変データ**: 生成された製品はイミュータブル
275
+ 5. **合成しやすさ**: ファクトリ関数を合成可能
276
+
277
+ ```fsharp
278
+ // パイプライン演算子を使った利用
279
+ let createForm factory =
280
+ let button = UIFactory.createButton factory "Submit"
281
+ let field = UIFactory.createTextField factory "Email"
282
+ (button, field)
283
+
284
+ let (windowsBtn, windowsField) = createForm UIFactory.Windows
285
+ let (macBtn, macField) = createForm UIFactory.MacOS
286
+ ```
287
+
288
+ ## まとめ
289
+
290
+ 本章では、Abstract Factory パターンについて学びました:
291
+
292
+ 1. **図形ファクトリ**: スタイル付き図形の生成
293
+ 2. **UI ファクトリ**: プラットフォーム別 UI コンポーネントの生成
294
+ 3. **データベースファクトリ**: DB 接続とコマンドの生成
295
+ 4. **ドキュメントファクトリ**: フォーマット別ドキュメント要素の生成
296
+ 5. **テーマファクトリ**: テーマ設定の生成
297
+
298
+ F# では、判別共用体とパターンマッチングにより、Abstract Factory パターンを型安全かつ簡潔に実装できます。
299
+
300
+ ## 参考コード
301
+
302
+ 本章のコード例は以下のファイルで確認できます:
303
+
304
+ - ソースコード: `apps/fsharp/part4/src/Library.fs`
305
+ - テストコード: `apps/fsharp/part4/tests/Tests.fs`
306
+
307
+ ## 次章予告
308
+
309
+ 次章では、**Abstract Server パターン**について学びます。クライアントとサーバー間の抽象化層を提供する方法を探ります。