@k2works/claude-code-booster 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
  2. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
  3. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
  4. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
  5. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
  24. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
  25. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
  26. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
  27. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
  28. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
  47. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
  48. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
  49. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
  50. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
  51. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
  70. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
  71. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
  72. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
  73. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
  74. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
  93. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
  94. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
  95. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
  96. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
  97. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
  116. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
  117. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
  118. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
  119. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
  120. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
  121. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
  163. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
  164. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
  165. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
  166. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
  167. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
  168. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
  169. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
  170. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
  171. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
  172. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
  173. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
  174. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
  175. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
  176. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
  177. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
  178. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
  179. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
  180. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
  181. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
  182. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
  183. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
  184. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
  185. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
  186. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
  187. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
  188. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
  189. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
  190. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
  191. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
  192. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
  193. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
  194. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
  195. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
  196. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
  197. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
  198. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
  199. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
  200. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
  201. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
  202. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
  203. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
  204. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
  205. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
  206. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
  207. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
  208. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
  209. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
  210. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
  211. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
  212. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
  213. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
  214. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
  215. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
  216. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
  217. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
  218. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
  219. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
  220. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
  221. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
  222. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
  223. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
  224. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
  225. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
  226. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
  227. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
  228. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
  229. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
  230. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
  231. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
  232. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
  233. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
  234. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
  235. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
  236. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
  237. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
  238. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
  239. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
  240. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
  241. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
  242. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
  243. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
  244. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
  245. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
  246. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
  247. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
  248. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
  249. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
  250. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
  251. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
  252. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
  253. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
  254. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
  255. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
  256. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
  257. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
  258. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
  259. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
  260. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
  261. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
  262. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
  263. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
  264. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
  265. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
  266. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
  267. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
  268. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
  269. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
  270. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
  271. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
  272. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
  273. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
  274. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
  275. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
  276. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
  277. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
  278. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
  279. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
  280. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
  281. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
  282. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
  283. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
  284. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
  285. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
  286. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
  287. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
  288. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
  289. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
  290. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
  291. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
  292. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
  293. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
  294. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
  295. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
  296. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
  297. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
  298. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
  299. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
  300. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
  301. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
  302. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
  303. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
  304. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
  305. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
  306. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
  307. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
  308. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
  309. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
  310. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
  311. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
  312. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
  313. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
  314. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
  315. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
  316. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
  317. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
  318. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
  319. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
  320. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
  321. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
  322. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
  323. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
  324. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
  325. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
  326. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
  327. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
  328. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
  329. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
  330. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
  331. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
  332. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
  333. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
  334. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
  335. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
  336. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
  337. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
  338. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
  339. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
  340. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
  341. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
  342. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
  343. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
  344. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
  345. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
  346. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
  347. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
  348. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
  349. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
  350. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
  351. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
  352. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
  353. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
  354. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
  355. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
  356. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
  357. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
  358. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
  359. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
  360. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
  361. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
  362. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
  363. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
  364. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
  365. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
  366. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
  367. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
  368. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
  369. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
  370. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
  371. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
  372. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
  373. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
  374. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
  375. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
  376. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
  377. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
  378. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
  379. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
  380. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
  381. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
  382. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
  383. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
  384. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
  385. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
  386. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
  387. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
  388. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
  389. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
  390. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
  391. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
  392. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
  393. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
  394. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
  395. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
  396. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
  397. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
  398. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
  399. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
  400. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
  401. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
  402. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
  403. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
  404. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
  405. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
  406. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
  407. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
  408. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
  409. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
  410. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
  411. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
  412. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
  413. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
  414. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
  415. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
  416. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
  417. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
  418. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
  419. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
  420. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
  421. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
  422. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
  423. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
  424. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
  425. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
  426. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
  427. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
  428. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
  429. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
  430. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
  431. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
  432. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
  433. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
  434. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
  435. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
  436. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
  437. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
  438. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
  439. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
  440. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
  441. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
  442. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
  443. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
  444. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
  445. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
  446. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
  447. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
  448. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
  449. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
  450. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
  451. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
  452. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
  453. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
  454. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
  455. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
  456. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
  457. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
  458. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
  459. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
  460. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
  461. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
  462. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
  463. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
  464. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
  465. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
  466. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
  467. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
  468. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
  469. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
  470. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
  471. package/lib/assets/docs/article/grokkingfp/index.md +143 -0
  472. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
  473. package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
  474. package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
  475. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
  476. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
  477. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
  478. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
  479. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
  480. package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
  481. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
  482. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
  483. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
  484. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
  485. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
  486. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
  487. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
  488. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
  489. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
  490. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
  491. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
  492. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
  493. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
  494. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
  495. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
  496. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
  497. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
  498. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
  499. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
  500. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
  501. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
  502. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
  503. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
  504. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
  505. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
  506. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
  507. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
  508. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
  509. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
  510. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
  511. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
  512. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
  513. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
  514. package/lib/assets/docs/article/index.md +36 -0
  515. package/lib/assets/docs/design/index.md +39 -27
  516. package/lib/assets/docs/development/index.md +11 -1
  517. package/lib/assets/docs/index.md +33 -106
  518. package/lib/assets/docs/operation/index.md +16 -6
  519. package/lib/assets/docs/reference/index.md +5 -4
  520. package/lib/assets/docs/requirements/index.md +13 -6
  521. package/lib/assets/docs/strategy/index.md +11 -4
  522. package/lib/assets/docs/template/index.md +9 -5
  523. package/lib/assets/mkdocs.yml +29 -17
  524. package/package.json +1 -1
@@ -0,0 +1,283 @@
1
+ # 第6章: テスト駆動開発と関数型プログラミング
2
+
3
+ ## はじめに
4
+
5
+ テスト駆動開発(TDD)は、テストを先に書いてから実装を行う開発手法です。関数型プログラミングと TDD は相性が良く、純粋関数はテストが容易で、不変データ構造は予測可能な動作を保証します。
6
+
7
+ 本章では、Red-Green-Refactor サイクルを Haskell で実践する方法を学びます。
8
+
9
+ ## 1. TDD の基本サイクル
10
+
11
+ ```plantuml
12
+ @startuml
13
+ title Red-Green-Refactor サイクル
14
+
15
+ state "Red" as red : 失敗するテストを書く
16
+ state "Green" as green : テストを通す最小限のコード
17
+ state "Refactor" as refactor : コードを改善
18
+
19
+ red --> green : 実装
20
+ green --> refactor : クリーンアップ
21
+ refactor --> red : 次のテスト
22
+
23
+ @enduml
24
+ ```
25
+
26
+ 1. **Red(赤)**: 失敗するテストを書く
27
+ 2. **Green(緑)**: テストを通す最小限のコードを書く
28
+ 3. **Refactor(リファクタリング)**: コードを改善する
29
+
30
+ ## 2. FizzBuzz - TDD の典型例
31
+
32
+ ### Step 1: Red(最初のテスト)
33
+
34
+ ```haskell
35
+ -- test/TddFunctionalSpec.hs
36
+ spec :: Spec
37
+ spec = do
38
+ describe "FizzBuzz" $ do
39
+ it "1 returns \"1\"" $
40
+ fizzBuzz 1 `shouldBe` "1"
41
+ ```
42
+
43
+ ### Step 2: Green(最小限の実装)
44
+
45
+ ```haskell
46
+ -- src/TddFunctional.hs
47
+ fizzBuzz :: Int -> String
48
+ fizzBuzz _ = "1"
49
+ ```
50
+
51
+ ### Step 3: 次のテストを追加
52
+
53
+ ```haskell
54
+ it "2 returns \"2\"" $
55
+ fizzBuzz 2 `shouldBe` "2"
56
+ ```
57
+
58
+ ### 段階的に実装を発展
59
+
60
+ ```haskell
61
+ -- 小さなヘルパー関数に分割
62
+ fizz :: Int -> Bool
63
+ fizz n = n `mod` 3 == 0
64
+
65
+ buzz :: Int -> Bool
66
+ buzz n = n `mod` 5 == 0
67
+
68
+ fizzBuzz :: Int -> String
69
+ fizzBuzz n
70
+ | fizz n && buzz n = "FizzBuzz"
71
+ | fizz n = "Fizz"
72
+ | buzz n = "Buzz"
73
+ | otherwise = show n
74
+ ```
75
+
76
+ ### 最終テストスイート
77
+
78
+ ```haskell
79
+ describe "FizzBuzz (Basic TDD)" $ do
80
+ it "1 returns \"1\"" $
81
+ fizzBuzz 1 `shouldBe` "1"
82
+ it "2 returns \"2\"" $
83
+ fizzBuzz 2 `shouldBe` "2"
84
+ it "3 returns \"Fizz\"" $
85
+ fizzBuzz 3 `shouldBe` "Fizz"
86
+ it "5 returns \"Buzz\"" $
87
+ fizzBuzz 5 `shouldBe` "Buzz"
88
+ it "15 returns \"FizzBuzz\"" $
89
+ fizzBuzz 15 `shouldBe` "FizzBuzz"
90
+ ```
91
+
92
+ ## 3. ローマ数字変換
93
+
94
+ ### TDD で段階的に実装
95
+
96
+ ```haskell
97
+ -- Step 1: 最初のテスト
98
+ it "converts 1 to I" $
99
+ toRoman 1 `shouldBe` "I"
100
+
101
+ -- Step 2: 最小限の実装
102
+ toRoman :: Int -> String
103
+ toRoman 1 = "I"
104
+ toRoman _ = ""
105
+
106
+ -- Step 3: テストを追加しながら発展
107
+ it "converts 4 to IV" $
108
+ toRoman 4 `shouldBe` "IV"
109
+ it "converts 5 to V" $
110
+ toRoman 5 `shouldBe` "V"
111
+ ```
112
+
113
+ ### 完成した実装
114
+
115
+ ```haskell
116
+ toRoman :: Int -> String
117
+ toRoman n
118
+ | n <= 0 = ""
119
+ | n >= 1000 = "M" ++ toRoman (n - 1000)
120
+ | n >= 900 = "CM" ++ toRoman (n - 900)
121
+ | n >= 500 = "D" ++ toRoman (n - 500)
122
+ | n >= 400 = "CD" ++ toRoman (n - 400)
123
+ | n >= 100 = "C" ++ toRoman (n - 100)
124
+ | n >= 90 = "XC" ++ toRoman (n - 90)
125
+ | n >= 50 = "L" ++ toRoman (n - 50)
126
+ | n >= 40 = "XL" ++ toRoman (n - 40)
127
+ | n >= 10 = "X" ++ toRoman (n - 10)
128
+ | n >= 9 = "IX" ++ toRoman (n - 9)
129
+ | n >= 5 = "V" ++ toRoman (n - 5)
130
+ | n >= 4 = "IV" ++ toRoman (n - 4)
131
+ | otherwise = "I" ++ toRoman (n - 1)
132
+
133
+ fromRoman :: String -> Int
134
+ fromRoman = go 0
135
+ where
136
+ go acc [] = acc
137
+ go acc [x] = acc + romanCharValue x
138
+ go acc (x:y:rest)
139
+ | romanCharValue x < romanCharValue y = go (acc - romanCharValue x) (y:rest)
140
+ | otherwise = go (acc + romanCharValue x) (y:rest)
141
+
142
+ romanCharValue 'I' = 1
143
+ romanCharValue 'V' = 5
144
+ romanCharValue 'X' = 10
145
+ romanCharValue 'L' = 50
146
+ romanCharValue 'C' = 100
147
+ romanCharValue 'D' = 500
148
+ romanCharValue 'M' = 1000
149
+ romanCharValue _ = 0
150
+ ```
151
+
152
+ ## 4. ボウリングスコア
153
+
154
+ ### ゲームの状態
155
+
156
+ ```haskell
157
+ type Game = ([Int], Int) -- (rolls, current frame)
158
+
159
+ newGame :: Game
160
+ newGame = ([], 1)
161
+
162
+ roll :: Int -> Game -> Game
163
+ roll pins (rolls, frame) = (rolls ++ [pins], frame)
164
+ ```
165
+
166
+ ### スコア計算
167
+
168
+ ```haskell
169
+ score :: Game -> Int
170
+ score (rolls, _) = scoreFrames rolls 1 0
171
+
172
+ scoreFrames :: [Int] -> Int -> Int -> Int
173
+ scoreFrames _ 11 acc = acc -- 10フレーム超えたら終了
174
+ scoreFrames [] _ acc = acc
175
+ scoreFrames rolls@(r1:rest) frame acc
176
+ | frame == 10 = acc + sum rolls -- 10フレーム目
177
+ | r1 == 10 = scoreFrames rest (frame + 1) (acc + 10 + bonus2 rest) -- Strike
178
+ | otherwise = case rest of
179
+ [] -> acc + r1
180
+ (r2:rest2)
181
+ | r1 + r2 == 10 -> scoreFrames rest2 (frame + 1) (acc + 10 + bonus1 rest2) -- Spare
182
+ | otherwise -> scoreFrames rest2 (frame + 1) (acc + r1 + r2)
183
+ where
184
+ bonus1 (x:_) = x
185
+ bonus1 [] = 0
186
+ bonus2 (x:y:_) = x + y
187
+ bonus2 (x:_) = x
188
+ bonus2 [] = 0
189
+ ```
190
+
191
+ ### テスト
192
+
193
+ ```haskell
194
+ describe "Bowling Game" $ do
195
+ it "starts with score 0" $
196
+ score newGame `shouldBe` 0
197
+
198
+ it "scores 0 for all zeros" $ do
199
+ let game = foldr roll newGame (replicate 20 0)
200
+ score game `shouldBe` 0
201
+
202
+ it "scores 20 for all ones" $ do
203
+ let game = foldr roll newGame (replicate 20 1)
204
+ score game `shouldBe` 20
205
+
206
+ it "spare adds next roll bonus" $ do
207
+ let rolls = [5, 5, 3] ++ replicate 17 0
208
+ let game = foldr roll newGame (reverse rolls)
209
+ score game `shouldBe` 16
210
+ ```
211
+
212
+ ## 5. String Calculator Kata
213
+
214
+ ```haskell
215
+ add :: String -> Int
216
+ add "" = 0
217
+ add s = sum $ parseNumbers s
218
+
219
+ parseNumbers :: String -> [Int]
220
+ parseNumbers s = map read $ splitOn ',' $ map replaceNewline s
221
+ where
222
+ replaceNewline '\n' = ','
223
+ replaceNewline c = c
224
+
225
+ splitOn _ [] = []
226
+ splitOn delim str =
227
+ let (before, after) = break (== delim) str
228
+ in before : case after of
229
+ [] -> []
230
+ (_:rest) -> splitOn delim rest
231
+ ```
232
+
233
+ ## 6. 素因数分解
234
+
235
+ ```haskell
236
+ primeFactors :: Int -> [Int]
237
+ primeFactors n = factorize n 2
238
+ where
239
+ factorize 1 _ = []
240
+ factorize num factor
241
+ | factor * factor > num = [num]
242
+ | num `mod` factor == 0 = factor : factorize (num `div` factor) factor
243
+ | otherwise = factorize num (factor + 1)
244
+ ```
245
+
246
+ ### テスト
247
+
248
+ ```haskell
249
+ describe "Prime Factors" $ do
250
+ it "returns empty for 1" $
251
+ primeFactors 1 `shouldBe` []
252
+ it "returns [2] for 2" $
253
+ primeFactors 2 `shouldBe` [2]
254
+ it "returns [2,2] for 4" $
255
+ primeFactors 4 `shouldBe` [2, 2]
256
+ it "returns [2,3] for 6" $
257
+ primeFactors 6 `shouldBe` [2, 3]
258
+
259
+ -- プロパティベーステスト
260
+ it "product of factors equals original" $ property $
261
+ \(Positive n) ->
262
+ let n' = max 2 (n `mod` 1000)
263
+ in product (primeFactors n') == n'
264
+ ```
265
+
266
+ ## 7. まとめ
267
+
268
+ ### TDD と FP の相性
269
+
270
+ | 特徴 | メリット |
271
+ |-----|---------|
272
+ | 純粋関数 | 入出力が明確でテストしやすい |
273
+ | 不変データ | 状態管理の複雑さがない |
274
+ | 型システム | 多くのバグをコンパイル時に検出 |
275
+ | パターンマッチ | 網羅的なケース処理 |
276
+
277
+ ### TDD のベストプラクティス
278
+
279
+ 1. **小さなステップで進める**: 一度に大きな変更をしない
280
+ 2. **最初に失敗するテストを書く**: テストが本当に機能していることを確認
281
+ 3. **最小限のコードで通す**: 過度な一般化を避ける
282
+ 4. **リファクタリングはグリーンの後**: テストが通った状態でのみ改善
283
+ 5. **プロパティベーステストを併用**: エッジケースの発見
@@ -0,0 +1,395 @@
1
+ # 第7章: Composite パターン
2
+
3
+ ## はじめに
4
+
5
+ Composite パターンは、オブジェクトをツリー構造で構成し、個々のオブジェクトとオブジェクトの集合を同じように扱うことができるようにするパターンです。このパターンを使用すると、クライアントは個々のオブジェクトとその組み合わせを区別せずに操作できます。
6
+
7
+ 本章では、図形(Shape)、スイッチ(Switchable)、ファイルシステム、メニュー、数式、組織構造など、様々な例を通じて Composite パターンの実装を学びます。
8
+
9
+ ## 1. パターンの構造
10
+
11
+ Composite パターンは以下の要素で構成されます:
12
+
13
+ - **Component**: 全てのオブジェクトの共通インターフェース
14
+ - **Leaf**: 子要素を持たない末端オブジェクト
15
+ - **Composite**: 子要素を持つコンテナオブジェクト
16
+
17
+ ```plantuml
18
+ @startuml
19
+ skinparam classAttributeIconSize 0
20
+
21
+ abstract class Component {
22
+ +operation(): Result
23
+ }
24
+
25
+ class Leaf {
26
+ +operation()
27
+ }
28
+
29
+ class Composite {
30
+ -children: [Component]
31
+ +add(c: Component)
32
+ +operation()
33
+ }
34
+
35
+ Component <|-- Leaf
36
+ Component <|-- Composite
37
+ Composite o-- Component : children
38
+ @enduml
39
+ ```
40
+
41
+ ## 2. Shape - 図形の Composite パターン
42
+
43
+ ### 代数的データ型による実装
44
+
45
+ Haskell では代数的データ型(ADT)を使って Component を表現します:
46
+
47
+ ```haskell
48
+ -- | 2D Point
49
+ data Point = Point
50
+ { pointX :: Double
51
+ , pointY :: Double
52
+ } deriving (Show, Eq)
53
+
54
+ -- | Shape - Composite pattern for geometric shapes
55
+ data Shape
56
+ = Circle Point Double -- ^ Circle with center and radius
57
+ | Square Point Double -- ^ Square with top-left corner and side length
58
+ | Rectangle Point Double Double -- ^ Rectangle with top-left, width, and height
59
+ | CompositeShape [Shape] -- ^ Composite containing multiple shapes
60
+ deriving (Show, Eq)
61
+ ```
62
+
63
+ ### 再帰的な操作
64
+
65
+ ```haskell
66
+ -- | Translate a shape by (dx, dy)
67
+ translateShape :: Double -> Double -> Shape -> Shape
68
+ translateShape dx dy shape = case shape of
69
+ Circle (Point x y) r -> Circle (Point (x + dx) (y + dy)) r
70
+ Square (Point x y) s -> Square (Point (x + dx) (y + dy)) s
71
+ Rectangle (Point x y) w h -> Rectangle (Point (x + dx) (y + dy)) w h
72
+ CompositeShape shapes -> CompositeShape (map (translateShape dx dy) shapes)
73
+
74
+ -- | Scale a shape by a factor
75
+ scaleShape :: Double -> Shape -> Shape
76
+ scaleShape factor shape = case shape of
77
+ Circle c r -> Circle c (r * factor)
78
+ Square tl s -> Square tl (s * factor)
79
+ Rectangle tl w h -> Rectangle tl (w * factor) (h * factor)
80
+ CompositeShape shapes -> CompositeShape (map (scaleShape factor) shapes)
81
+
82
+ -- | Calculate the area of a shape
83
+ shapeArea :: Shape -> Double
84
+ shapeArea shape = case shape of
85
+ Circle _ r -> pi * r * r
86
+ Square _ s -> s * s
87
+ Rectangle _ w h -> w * h
88
+ CompositeShape shapes -> sum (map shapeArea shapes)
89
+ ```
90
+
91
+ ### 使用例
92
+
93
+ ```haskell
94
+ -- 個々の図形を作成
95
+ let circle = Circle (Point 10 10) 5
96
+ let square = Square (Point 0 0) 10
97
+
98
+ -- 複合図形を作成
99
+ let group = addShape square (addShape circle emptyComposite)
100
+ -- CompositeShape [Circle (Point 10 10) 5, Square (Point 0 0) 10]
101
+
102
+ -- 複合図形を移動(全ての子要素が移動する)
103
+ let moved = translateShape 5 5 group
104
+ -- CompositeShape [Circle (Point 15 15) 5, Square (Point 5 5) 10]
105
+
106
+ -- 複合図形を拡大(全ての子要素が拡大する)
107
+ let scaled = scaleShape 2 group
108
+ -- CompositeShape [Circle (Point 10 10) 10, Square (Point 0 0) 20]
109
+
110
+ -- 面積は全ての子要素の合計
111
+ let totalArea = shapeArea group -- pi * 25 + 100
112
+ ```
113
+
114
+ ## 3. Switchable - スイッチの Composite パターン
115
+
116
+ ```haskell
117
+ -- | Switchable - Composite pattern for switchable devices
118
+ data Switchable
119
+ = Light String Bool -- ^ Light with name and on/off state
120
+ | DimmableLight String Int -- ^ Dimmable light with name and intensity (0-100)
121
+ | Fan String Bool Int -- ^ Fan with name, on/off state, and speed
122
+ | CompositeSwitchable String [Switchable] -- ^ Composite with name and list
123
+ deriving (Show, Eq)
124
+
125
+ -- | Turn on a switchable
126
+ turnOn :: Switchable -> Switchable
127
+ turnOn switchable = case switchable of
128
+ Light name _ -> Light name True
129
+ DimmableLight name _ -> DimmableLight name 100
130
+ Fan name _ speed -> Fan name True (max speed 1)
131
+ CompositeSwitchable name items -> CompositeSwitchable name (map turnOn items)
132
+
133
+ -- | Check if a switchable is on
134
+ isOn :: Switchable -> Bool
135
+ isOn switchable = case switchable of
136
+ Light _ on -> on
137
+ DimmableLight _ intensity -> intensity > 0
138
+ Fan _ on _ -> on
139
+ CompositeSwitchable _ items -> any isOn items
140
+ ```
141
+
142
+ ### 使用例
143
+
144
+ ```haskell
145
+ -- 部屋のスイッチグループを作成
146
+ let bedroom = emptySwitchableComposite "Bedroom"
147
+ |> addSwitchable (Light "Ceiling" False)
148
+ |> addSwitchable (DimmableLight "Bedside" 0)
149
+
150
+ let livingRoom = emptySwitchableComposite "LivingRoom"
151
+ |> addSwitchable (Light "Main" False)
152
+ |> addSwitchable (Fan "CeilingFan" False 0)
153
+
154
+ -- 家全体のグループ
155
+ let house = emptySwitchableComposite "House"
156
+ |> addSwitchable bedroom
157
+ |> addSwitchable livingRoom
158
+
159
+ -- 家中の全てのスイッチをオン
160
+ let allOn = turnOn house
161
+ ```
162
+
163
+ ## 4. FileSystem - ファイルシステムの Composite パターン
164
+
165
+ ```haskell
166
+ -- | FileSystemEntry - Composite pattern for file system
167
+ data FileSystemEntry
168
+ = File String Int String -- ^ File with name, size, and extension
169
+ | Directory String [FileSystemEntry] -- ^ Directory with name and children
170
+ deriving (Show, Eq)
171
+
172
+ -- | Get the total size of a file system entry
173
+ fileSize :: FileSystemEntry -> Int
174
+ fileSize entry = case entry of
175
+ File _ size _ -> size
176
+ Directory _ children -> sum (map fileSize children)
177
+
178
+ -- | Find files by extension
179
+ findByExtension :: String -> FileSystemEntry -> [FileSystemEntry]
180
+ findByExtension ext entry = case entry of
181
+ File _ _ fileExt | fileExt == ext -> [entry]
182
+ File {} -> []
183
+ Directory _ children -> concatMap (findByExtension ext) children
184
+ ```
185
+
186
+ ### 使用例
187
+
188
+ ```haskell
189
+ -- ファイルシステム構造を構築
190
+ let readme = File "readme.txt" 1024 ".txt"
191
+ let config = File "config.json" 512 ".json"
192
+ let src = Directory "src"
193
+ [ File "main.fs" 2048 ".fs"
194
+ , File "util.fs" 1024 ".fs"
195
+ ]
196
+ let root = Directory "project" [readme, config, src]
197
+
198
+ -- 総サイズを取得
199
+ let totalSize = fileSize root -- 4608
200
+
201
+ -- .fs ファイルを検索
202
+ let fsFiles = findByExtension ".fs" root -- 2 files
203
+ ```
204
+
205
+ ## 5. MenuItem - メニューの Composite パターン
206
+
207
+ ```haskell
208
+ -- | MenuItem - Composite pattern for menu items
209
+ data MenuItem
210
+ = Item String Double String -- ^ Item with name, price, and category
211
+ | SetMenu String [MenuItem] Double -- ^ Set menu with name, items, and discount rate
212
+ deriving (Show, Eq)
213
+
214
+ -- | Calculate the price of a menu item
215
+ menuPrice :: MenuItem -> Double
216
+ menuPrice item = case item of
217
+ Item _ price _ -> price
218
+ SetMenu _ items discountRate ->
219
+ let totalPrice = sum (map menuPrice items)
220
+ in totalPrice * (1 - discountRate)
221
+ ```
222
+
223
+ ### 使用例
224
+
225
+ ```haskell
226
+ -- 単品メニュー
227
+ let burger = Item "Hamburger" 500 "Main"
228
+ let fries = Item "Fries" 200 "Side"
229
+ let drink = Item "Cola" 150 "Drink"
230
+
231
+ -- セットメニュー(10%割引)
232
+ let lunchSet = SetMenu "Lunch Set" [burger, fries, drink] 0.1
233
+
234
+ -- セット価格 = (500 + 200 + 150) * 0.9 = 765
235
+ let setPrice = menuPrice lunchSet
236
+ ```
237
+
238
+ ## 6. Expression - 数式の Composite パターン
239
+
240
+ ```haskell
241
+ -- | Expression - Composite pattern for mathematical expressions
242
+ data Expr
243
+ = Number Double -- ^ Numeric literal
244
+ | Variable String (Maybe Double) -- ^ Variable with optional bound value
245
+ | Add Expr Expr -- ^ Addition
246
+ | Subtract Expr Expr -- ^ Subtraction
247
+ | Multiply Expr Expr -- ^ Multiplication
248
+ | Divide Expr Expr -- ^ Division
249
+ | Negate Expr -- ^ Negation
250
+ deriving (Show, Eq)
251
+
252
+ -- | Evaluate an expression
253
+ evaluate :: Expr -> Maybe Double
254
+ evaluate expr = case expr of
255
+ Number n -> Just n
256
+ Variable _ (Just v) -> Just v
257
+ Variable _ Nothing -> Nothing -- Unbound variable
258
+ Add l r -> (+) <$> evaluate l <*> evaluate r
259
+ Subtract l r -> (-) <$> evaluate l <*> evaluate r
260
+ Multiply l r -> (*) <$> evaluate l <*> evaluate r
261
+ Divide l r -> do
262
+ lv <- evaluate l
263
+ rv <- evaluate r
264
+ if rv == 0 then Nothing else Just (lv / rv)
265
+ Negate e -> negate <$> evaluate e
266
+
267
+ -- | Simplify an expression
268
+ simplify :: Expr -> Expr
269
+ simplify expr = case expr of
270
+ Add l r -> case (simplify l, simplify r) of
271
+ (Number 0, r') -> r'
272
+ (l', Number 0) -> l'
273
+ (Number a, Number b) -> Number (a + b)
274
+ (l', r') -> Add l' r'
275
+ -- ... other cases
276
+ ```
277
+
278
+ ### 使用例
279
+
280
+ ```haskell
281
+ -- (2 + 3) * 4 = 20
282
+ let expr = Multiply (Add (Number 2) (Number 3)) (Number 4)
283
+ let result = evaluate expr -- Just 20
284
+
285
+ -- 変数を含む式
286
+ let exprWithVars = Add (Variable "x" Nothing) (Variable "y" Nothing)
287
+ let bound = bindVars [("x", 10), ("y", 20)] exprWithVars
288
+ let value = evaluate bound -- Just 30
289
+
290
+ -- 式の簡略化
291
+ let simplified = simplify (Add (Variable "x" Nothing) (Number 0))
292
+ -- => Variable "x" Nothing
293
+ ```
294
+
295
+ ## 7. Organization - 組織構造の Composite パターン
296
+
297
+ ```haskell
298
+ -- | OrganizationMember - Composite pattern for organizational structure
299
+ data OrganizationMember
300
+ = Employee String Double String -- ^ Employee with name, salary, and role
301
+ | Department String (Maybe String) [OrganizationMember]
302
+ -- ^ Department with name, manager, and members
303
+ deriving (Show, Eq)
304
+
305
+ -- | Calculate the total salary
306
+ totalSalary :: OrganizationMember -> Double
307
+ totalSalary member = case member of
308
+ Employee _ salary _ -> salary
309
+ Department _ _ members -> sum (map totalSalary members)
310
+
311
+ -- | Find employees by role
312
+ findByRole :: String -> OrganizationMember -> [OrganizationMember]
313
+ findByRole role member = case member of
314
+ Employee _ _ r | r == role -> [member]
315
+ Employee {} -> []
316
+ Department _ _ members -> concatMap (findByRole role) members
317
+ ```
318
+
319
+ ## パターンの利点
320
+
321
+ 1. **統一的な操作**: 個々のオブジェクトとグループを同じインターフェースで操作可能
322
+ 2. **階層構造**: ネストした構造を自然に表現可能
323
+ 3. **拡張性**: 新しい Leaf や Composite を追加しやすい
324
+ 4. **再帰的な構造**: Composite は他の Composite を含むことも可能
325
+
326
+ ## Haskell での特徴
327
+
328
+ ### 代数的データ型による型安全性
329
+
330
+ ```haskell
331
+ -- 全てのケースを網羅するパターンマッチ
332
+ shapeArea :: Shape -> Double
333
+ shapeArea shape = case shape of
334
+ Circle _ r -> pi * r * r
335
+ Square _ s -> s * s
336
+ Rectangle _ w h -> w * h
337
+ CompositeShape shapes -> sum (map shapeArea shapes)
338
+ -- 新しいケースを追加すると、コンパイラが警告を出す
339
+ ```
340
+
341
+ ### 不変性による安全な操作
342
+
343
+ ```haskell
344
+ -- 元のオブジェクトは変更されない
345
+ let original = addShape (Circle (Point 0 0) 5) emptyComposite
346
+ let moved = translateShape 10 10 original
347
+ -- original は変更されていない
348
+ ```
349
+
350
+ ### 再帰関数と高階関数
351
+
352
+ ```haskell
353
+ -- 再帰的な処理も簡潔に
354
+ let result = emptyComposite
355
+ & addShape circle
356
+ & addShape square
357
+ & translateShape 5 5
358
+ & scaleShape 2
359
+ & shapeArea
360
+ ```
361
+
362
+ ## Clojure/F# との比較
363
+
364
+ | 概念 | Clojure | F# | Haskell |
365
+ |------|---------|-----|---------|
366
+ | インターフェース | マルチメソッド | 判別共用体 | ADT |
367
+ | Leaf | defmethod | Union case | Constructor |
368
+ | Composite | defmethod + mapv | Union case with list | Constructor with list |
369
+ | 操作の委譲 | mapv | List.map | map |
370
+ | 不変性 | デフォルト | デフォルト | 強制 |
371
+ | 網羅性チェック | なし | 完全チェック | 完全チェック |
372
+
373
+ ## まとめ
374
+
375
+ 本章では、Composite パターンについて学びました:
376
+
377
+ 1. **Shape の例**: 図形の移動と拡大を統一的に操作
378
+ 2. **Switchable の例**: 複数のスイッチをグループ化して操作
379
+ 3. **FileSystem の例**: ファイルとディレクトリの階層構造
380
+ 4. **Menu の例**: 単品とセットメニューの価格計算
381
+ 5. **Expression の例**: 数式の評価と簡略化
382
+ 6. **Organization の例**: 組織構造の給与計算
383
+
384
+ Composite パターンは、ツリー構造のデータを扱う際に非常に有効なパターンです。Haskell の代数的データ型とパターンマッチを使うことで、型安全で不変なツリー構造を簡潔に実装できます。
385
+
386
+ ## 参考コード
387
+
388
+ 本章のコード例は以下のファイルで確認できます:
389
+
390
+ - ソースコード: `apps/haskell/part3/src/CompositePattern.hs`
391
+ - テストコード: `apps/haskell/part3/test/CompositePatternSpec.hs`
392
+
393
+ ## 次章予告
394
+
395
+ 次章では、**Decorator パターン**について学びます。既存の機能に新しい機能を動的に追加する方法を探ります。