@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,739 @@
1
+ # 第19章: Wa-Tor シミュレーション
2
+
3
+ ## はじめに
4
+
5
+ 本章では、Wa-Tor(Water Torus)シミュレーションを通じて、セルオートマトンとマルチメソッドを使った捕食者-被食者モデルの実装を学びます。
6
+
7
+ Wa-Tor は1984年に A.K. Dewdney が Scientific American で紹介した古典的なシミュレーションで、魚(被食者)とサメ(捕食者)の生態系をモデル化します。
8
+
9
+ この問題を通じて以下の概念を学びます:
10
+
11
+ - セルオートマトンの実装
12
+ - マルチメソッドによる多態的な振る舞い
13
+ - トーラス型ワールドの座標計算
14
+ - 繁殖と捕食のルール実装
15
+
16
+ ## 1. Wa-Tor の世界
17
+
18
+ ### トーラス型ワールド
19
+
20
+ Wa-Tor の世界はトーラス(ドーナツ型)です。端に到達すると反対側に出現します。
21
+
22
+ ```plantuml
23
+ @startuml
24
+ title トーラス型ワールド
25
+
26
+ rectangle "2D Grid" {
27
+ card "[0,0]" as c00
28
+ card "[1,0]" as c10
29
+ card "[2,0]" as c20
30
+ card "[0,1]" as c01
31
+ card "[1,1]" as c11
32
+ card "[2,1]" as c21
33
+ card "[0,2]" as c02
34
+ card "[1,2]" as c12
35
+ card "[2,2]" as c22
36
+ }
37
+
38
+ c00 --> c10
39
+ c10 --> c20
40
+ c20 --> c00 : wrap
41
+
42
+ c00 --> c01
43
+ c01 --> c02
44
+ c02 --> c00 : wrap
45
+
46
+ note bottom
47
+ 端から端へワープする
48
+ 例: [3,0] → [0,0]
49
+ 例: [-1,0] → [2,0]
50
+ end note
51
+ @enduml
52
+ ```
53
+
54
+ ### セルの種類
55
+
56
+ - **水(Water)**: 空のセル
57
+ - **魚(Fish)**: 被食者、移動と繁殖のみ
58
+ - **サメ(Shark)**: 捕食者、移動、繁殖、捕食
59
+
60
+ ## 2. 段階的な実装
61
+
62
+ ### Phase 1: 基本構造
63
+
64
+ まず、セルとワールドの基本構造を定義します。
65
+
66
+ ```clojure
67
+ (ns wator.cell)
68
+
69
+ (defmulti tick
70
+ "セルの1ステップを実行"
71
+ (fn [cell & _args] (::type cell)))
72
+
73
+ (defmulti display
74
+ "セルの表示文字を取得"
75
+ ::type)
76
+ ```
77
+
78
+ ### Phase 2: 水セル
79
+
80
+ 最もシンプルなセルである水を実装します。
81
+
82
+ ```clojure
83
+ (ns wator.water
84
+ (:require [wator.cell :as cell]))
85
+
86
+ (defn make
87
+ "水セルを作成"
88
+ []
89
+ {::cell/type ::water})
90
+
91
+ (defn is?
92
+ "水セルかどうか判定"
93
+ [cell]
94
+ (= ::water (::cell/type cell)))
95
+
96
+ (defmethod cell/tick ::water
97
+ [_water _loc _world]
98
+ nil)
99
+
100
+ (defmethod cell/display ::water
101
+ [_water]
102
+ ".")
103
+ ```
104
+
105
+ ### Phase 3: ワールド構造
106
+
107
+ ```clojure
108
+ (ns wator.world
109
+ (:require [wator.cell :as cell]
110
+ [wator.water :as water]))
111
+
112
+ (declare neighbors get-cell)
113
+
114
+ (defn make
115
+ "ワールドを作成"
116
+ [width height]
117
+ (let [locs (for [x (range width) y (range height)] [x y])
118
+ cells (into {} (map (fn [loc] [loc (water/make)]) locs))]
119
+ {:type ::world
120
+ :width width
121
+ :height height
122
+ :cells cells
123
+ :neighbors-fn neighbors
124
+ :get-cell-fn get-cell}))
125
+ ```
126
+
127
+ ### Phase 4: 座標のラップ
128
+
129
+ ```clojure
130
+ (defn wrap
131
+ "座標をトーラス上でラップ"
132
+ [world [x y]]
133
+ (let [{:keys [width height]} world]
134
+ [(mod x width) (mod y height)]))
135
+
136
+ (defn neighbors
137
+ "隣接セルの座標を取得(8方向)"
138
+ [world [x y]]
139
+ (let [deltas (for [dx [-1 0 1] dy [-1 0 1]
140
+ :when (not (and (= dx 0) (= dy 0)))]
141
+ [dx dy])]
142
+ (map (fn [[dx dy]]
143
+ (wrap world [(+ x dx) (+ y dy)]))
144
+ deltas)))
145
+ ```
146
+
147
+ ```plantuml
148
+ @startuml
149
+ title 隣接セルの計算
150
+
151
+ rectangle "3x3 Grid" {
152
+ card "[-1,-1]" as nw
153
+ card "[0,-1]" as n
154
+ card "[1,-1]" as ne
155
+ card "[-1,0]" as w
156
+ card "[0,0]\nCenter" as c
157
+ card "[1,0]" as e
158
+ card "[-1,1]" as sw
159
+ card "[0,1]" as s
160
+ card "[1,1]" as se
161
+ }
162
+
163
+ c --> nw
164
+ c --> n
165
+ c --> ne
166
+ c --> w
167
+ c --> e
168
+ c --> sw
169
+ c --> s
170
+ c --> se
171
+
172
+ note bottom
173
+ 8方向の隣接セルを取得
174
+ ワールドの端ではラップする
175
+ end note
176
+ @enduml
177
+ ```
178
+
179
+ ## 3. 動物の基本機能
180
+
181
+ ### Phase 5: 動物の共通機能
182
+
183
+ ```clojure
184
+ (ns wator.animal
185
+ (:require [wator.cell :as cell]
186
+ [wator.water :as water]))
187
+
188
+ (defmulti move (fn [animal & _args] (::cell/type animal)))
189
+ (defmulti reproduce (fn [animal & _args] (::cell/type animal)))
190
+ (defmulti make-child ::cell/type)
191
+ (defmulti get-reproduction-age ::cell/type)
192
+
193
+ (defn make
194
+ "動物の基本属性を作成"
195
+ []
196
+ {::age 0})
197
+
198
+ (defn age [animal]
199
+ (::age animal))
200
+
201
+ (defn increment-age [animal]
202
+ (update animal ::age inc))
203
+ ```
204
+
205
+ ### Phase 6: 移動ロジック
206
+
207
+ ```clojure
208
+ (defn find-empty-neighbors
209
+ "隣接する空のセルを検索"
210
+ [world loc]
211
+ (let [neighbors ((:neighbors-fn world) world loc)]
212
+ (filter #(water/is? ((:get-cell-fn world) world %)) neighbors)))
213
+
214
+ (defn do-move
215
+ "動物を空のセルに移動"
216
+ [animal loc world]
217
+ (let [destinations (find-empty-neighbors world loc)]
218
+ (if (empty? destinations)
219
+ [nil {loc animal}]
220
+ (let [new-loc (rand-nth destinations)]
221
+ [{loc (water/make)} {new-loc animal}]))))
222
+ ```
223
+
224
+ ### Phase 7: 繁殖ロジック
225
+
226
+ ```clojure
227
+ (defn do-reproduce
228
+ "動物が繁殖を試みる"
229
+ [animal loc world]
230
+ (if (>= (age animal) (get-reproduction-age animal))
231
+ (let [birth-places (find-empty-neighbors world loc)]
232
+ (if (empty? birth-places)
233
+ nil
234
+ (let [new-loc (rand-nth birth-places)]
235
+ [{loc (set-age animal 0)}
236
+ {new-loc (make-child animal)}])))
237
+ nil))
238
+ ```
239
+
240
+ ```plantuml
241
+ @startuml
242
+ title 繁殖のルール
243
+
244
+ start
245
+ :年齢を確認;
246
+
247
+ if (年齢 >= 繁殖可能年齢?) then (yes)
248
+ :隣接する空セルを検索;
249
+
250
+ if (空セルがある?) then (yes)
251
+ :ランダムに選択;
252
+ :親の年齢をリセット;
253
+ :子を空セルに配置;
254
+ :繁殖成功;
255
+ else (no)
256
+ :繁殖失敗;
257
+ endif
258
+ else (no)
259
+ :繁殖しない;
260
+ endif
261
+
262
+ stop
263
+ @enduml
264
+ ```
265
+
266
+ ## 4. 魚の実装
267
+
268
+ ### Phase 8: 魚クラス
269
+
270
+ ```clojure
271
+ (ns wator.fish
272
+ (:require [wator.cell :as cell]
273
+ [wator.animal :as animal]
274
+ [wator.config :as config]))
275
+
276
+ (defn is? [cell]
277
+ (= ::fish (::cell/type cell)))
278
+
279
+ (defn make []
280
+ (merge {::cell/type ::fish}
281
+ (animal/make)))
282
+
283
+ (defmethod animal/make-child ::fish [_fish]
284
+ (make))
285
+
286
+ (defmethod animal/get-reproduction-age ::fish [_fish]
287
+ config/fish-reproduction-age)
288
+
289
+ (defmethod animal/move ::fish [fish loc world]
290
+ (animal/do-move fish loc world))
291
+
292
+ (defmethod animal/reproduce ::fish [fish loc world]
293
+ (animal/do-reproduce fish loc world))
294
+
295
+ (defmethod cell/tick ::fish [fish loc world]
296
+ (animal/tick fish loc world))
297
+
298
+ (defmethod cell/display ::fish [_fish]
299
+ "f")
300
+ ```
301
+
302
+ ## 5. サメの実装
303
+
304
+ ### Phase 9: サメの基本構造
305
+
306
+ ```clojure
307
+ (ns wator.shark
308
+ (:require [wator.cell :as cell]
309
+ [wator.animal :as animal]
310
+ [wator.water :as water]
311
+ [wator.fish :as fish]
312
+ [wator.config :as config]))
313
+
314
+ (defn is? [cell]
315
+ (= ::shark (::cell/type cell)))
316
+
317
+ (defn make []
318
+ (merge {::cell/type ::shark
319
+ ::health config/shark-starting-health}
320
+ (animal/make)))
321
+ ```
322
+
323
+ ### Phase 10: サメの体力管理
324
+
325
+ ```clojure
326
+ (defn health [shark]
327
+ (::health shark))
328
+
329
+ (defn set-health [shark new-health]
330
+ (assoc shark ::health new-health))
331
+
332
+ (defn decrement-health [shark]
333
+ (update shark ::health dec))
334
+
335
+ (defn feed [shark]
336
+ (let [new-health (min config/shark-max-health
337
+ (+ (health shark) config/shark-eating-health))]
338
+ (set-health shark new-health)))
339
+ ```
340
+
341
+ ### Phase 11: サメの捕食
342
+
343
+ ```clojure
344
+ (defn find-fish-neighbors
345
+ "隣接する魚を検索"
346
+ [world loc]
347
+ (let [neighbors ((:neighbors-fn world) world loc)]
348
+ (filter #(fish/is? ((:get-cell-fn world) world %)) neighbors)))
349
+
350
+ (defn eat
351
+ "魚を食べる"
352
+ [shark loc world]
353
+ (let [fishy-neighbors (find-fish-neighbors world loc)]
354
+ (if (empty? fishy-neighbors)
355
+ nil
356
+ (let [target (rand-nth fishy-neighbors)]
357
+ [{loc (water/make)}
358
+ {target (feed shark)}]))))
359
+ ```
360
+
361
+ ### Phase 12: サメのティック処理
362
+
363
+ ```clojure
364
+ (defmethod cell/tick ::shark [shark loc world]
365
+ (if (<= (health shark) 1)
366
+ ;; 体力が尽きたら死亡
367
+ [nil {loc (water/make)}]
368
+ (let [aged-shark (-> shark
369
+ animal/increment-age
370
+ decrement-health)]
371
+ ;; 優先順位: 繁殖 > 捕食 > 移動
372
+ (or (animal/reproduce aged-shark loc world)
373
+ (eat aged-shark loc world)
374
+ (animal/move aged-shark loc world)))))
375
+ ```
376
+
377
+ ```plantuml
378
+ @startuml
379
+ title サメのティック処理
380
+
381
+ start
382
+ :体力を確認;
383
+
384
+ if (体力 <= 1?) then (yes)
385
+ :死亡(水に置換);
386
+ stop
387
+ else (no)
388
+ :年齢+1, 体力-1;
389
+ endif
390
+
391
+ :繁殖を試みる;
392
+ if (繁殖成功?) then (yes)
393
+ :繁殖結果を返す;
394
+ stop
395
+ else (no)
396
+ endif
397
+
398
+ :捕食を試みる;
399
+ if (捕食成功?) then (yes)
400
+ :体力回復;
401
+ :捕食結果を返す;
402
+ stop
403
+ else (no)
404
+ endif
405
+
406
+ :移動を試みる;
407
+ :移動結果を返す;
408
+ stop
409
+ @enduml
410
+ ```
411
+
412
+ ## 6. シミュレーションの実行
413
+
414
+ ### Phase 13: ワールドの更新
415
+
416
+ ```clojure
417
+ (defn tick-cell
418
+ "1つのセルを更新"
419
+ [world loc]
420
+ (let [cell (get-cell world loc)]
421
+ (cell/tick cell loc world)))
422
+
423
+ (defn tick
424
+ "ワールドの1ステップを実行"
425
+ [world]
426
+ (let [locs (shuffle (keys (:cells world)))
427
+ changes (map #(tick-cell world %) locs)]
428
+ (apply-changes world (flatten (remove nil? changes)))))
429
+ ```
430
+
431
+ ## 7. 設定パラメータ
432
+
433
+ ```clojure
434
+ (ns wator.config)
435
+
436
+ ;; 魚の設定
437
+ (def fish-reproduction-age 6)
438
+
439
+ ;; サメの設定
440
+ (def shark-reproduction-age 5)
441
+ (def shark-reproduction-health 8)
442
+ (def shark-starting-health 5)
443
+ (def shark-eating-health 5)
444
+ (def shark-max-health 10)
445
+ ```
446
+
447
+ | パラメータ | 説明 | デフォルト値 |
448
+ |-----------|------|-------------|
449
+ | fish-reproduction-age | 魚の繁殖可能年齢 | 6 |
450
+ | shark-reproduction-age | サメの繁殖可能年齢 | 5 |
451
+ | shark-starting-health | サメの初期体力 | 5 |
452
+ | shark-eating-health | 捕食時の体力回復量 | 5 |
453
+ | shark-max-health | サメの最大体力 | 10 |
454
+ | shark-reproduction-health | 繁殖に必要な体力 | 8 |
455
+
456
+ ## 8. 使用例
457
+
458
+ ```clojure
459
+ (require '[wator.world :as world])
460
+ (require '[wator.fish :as fish])
461
+ (require '[wator.shark :as shark])
462
+
463
+ ;; 10x10 のワールドを作成
464
+ (def w (world/make 10 10))
465
+
466
+ ;; 魚20匹、サメ5匹をランダム配置
467
+ (def w (world/populate-random w 20 5))
468
+
469
+ ;; 統計情報
470
+ (world/statistics w)
471
+ ;; => {:fish 20, :sharks 5, :water 75, :total 100}
472
+
473
+ ;; ワールドを表示
474
+ (println (world/display w))
475
+ ;; ..f.......
476
+ ;; .S....f...
477
+ ;; ..f.......
478
+ ;; ...f..f...
479
+ ;; ....S.....
480
+ ;; .f........
481
+ ;; ......f...
482
+ ;; ..f...S...
483
+ ;; ....f.....
484
+ ;; .......f..
485
+
486
+ ;; 1ステップ実行
487
+ (def w' (world/tick w))
488
+
489
+ ;; 100ステップ実行
490
+ (def w-100 (nth (iterate world/tick w) 100))
491
+ ```
492
+
493
+ ## 9. シミュレーションのダイナミクス
494
+
495
+ ```plantuml
496
+ @startuml
497
+ title 捕食者-被食者ダイナミクス
498
+
499
+ rectangle "魚の増加" as fish_up {
500
+ card "繁殖" as fb
501
+ }
502
+
503
+ rectangle "魚の減少" as fish_down {
504
+ card "捕食される" as fe
505
+ }
506
+
507
+ rectangle "サメの増加" as shark_up {
508
+ card "繁殖" as sb
509
+ }
510
+
511
+ rectangle "サメの減少" as shark_down {
512
+ card "餓死" as sd
513
+ }
514
+
515
+ fb --> fe : 魚が増えると\nサメが増える
516
+ fe --> sb : 餌が増えると\n繁殖しやすい
517
+ sb --> sd : サメが増えすぎると\n餌不足で餓死
518
+ sd --> fb : サメが減ると\n魚が増える
519
+
520
+ note bottom
521
+ 典型的な捕食者-被食者モデル
522
+ (Lotka-Volterra 的な振動)
523
+ end note
524
+ @enduml
525
+ ```
526
+
527
+ ## 10. GUI との統合(Quil)
528
+
529
+ ### Quil ライブラリ
530
+
531
+ Quil は Processing を Clojure から利用するためのライブラリです。シミュレーションを視覚化できます。
532
+
533
+ ```clojure
534
+ (ns wator-gui.main
535
+ (:require [quil.core :as q]
536
+ [quil.middleware :as m]
537
+ [wator.world :as world]
538
+ [wator.fish :as fish]
539
+ [wator.shark :as shark]
540
+ [wator.water :as water]))
541
+ ```
542
+
543
+ ### セットアップ関数
544
+
545
+ ```clojure
546
+ (def cell-size 10)
547
+ (def world-width 60)
548
+ (def world-height 40)
549
+
550
+ (defn setup []
551
+ (q/frame-rate 10)
552
+ (q/color-mode :rgb)
553
+ ;; 初期ワールドを作成
554
+ (-> (world/make world-width world-height)
555
+ (world/populate-random 200 30)))
556
+
557
+ (defn draw-state [world]
558
+ (q/background 0 100 200) ; 青い海
559
+ (doseq [[[x y] cell] (:cells world)]
560
+ (cond
561
+ (fish/is? cell)
562
+ (do
563
+ (q/fill 0 255 0) ; 緑: 魚
564
+ (q/rect (* x cell-size) (* y cell-size) cell-size cell-size))
565
+
566
+ (shark/is? cell)
567
+ (do
568
+ (q/fill 255 0 0) ; 赤: サメ
569
+ (q/rect (* x cell-size) (* y cell-size) cell-size cell-size)))))
570
+ ```
571
+
572
+ ### 更新関数
573
+
574
+ ```clojure
575
+ (defn update-state [world]
576
+ (world/tick world))
577
+ ```
578
+
579
+ ### メイン関数
580
+
581
+ ```clojure
582
+ (defn -main []
583
+ (q/defsketch wator-simulation
584
+ :title "Wa-Tor Simulation"
585
+ :size [(* world-width cell-size) (* world-height cell-size)]
586
+ :setup setup
587
+ :update update-state
588
+ :draw draw-state
589
+ :middleware [m/fun-mode]))
590
+ ```
591
+
592
+ ```plantuml
593
+ @startuml
594
+ title Quil アプリケーションのライフサイクル
595
+
596
+ participant "Quil" as quil
597
+ participant "setup" as setup
598
+ participant "update-state" as update
599
+ participant "draw-state" as draw
600
+ participant "World" as world
601
+
602
+ quil -> setup : 初期化
603
+ setup -> world : make & populate-random
604
+ world --> setup : initial-world
605
+ setup --> quil : initial-state
606
+
607
+ loop 毎フレーム(10fps)
608
+ quil -> update : update-state(world)
609
+ update -> world : tick
610
+ world --> update : new-world
611
+ update --> quil : new-state
612
+
613
+ quil -> draw : draw-state(new-world)
614
+ draw -> draw : 背景描画(青い海)
615
+ draw -> draw : 魚を緑で描画
616
+ draw -> draw : サメを赤で描画
617
+ draw --> quil : done
618
+ end
619
+ @enduml
620
+ ```
621
+
622
+ ### 統計情報の表示
623
+
624
+ ```clojure
625
+ (defn draw-stats [world]
626
+ (let [stats (world/statistics world)]
627
+ (q/fill 255)
628
+ (q/text-size 14)
629
+ (q/text (str "Fish: " (:fish stats)) 10 20)
630
+ (q/text (str "Sharks: " (:sharks stats)) 10 40)
631
+ (q/text (str "Generation: " (:generation world 0)) 10 60)))
632
+ ```
633
+
634
+ ### キーボードインタラクション
635
+
636
+ ```clojure
637
+ (defn key-pressed [world event]
638
+ (case (:key event)
639
+ :r (-> (world/make world-width world-height)
640
+ (world/populate-random 200 30)) ; リセット
641
+ :p (assoc world :paused (not (:paused world))) ; 一時停止
642
+ :+ (update world :speed inc) ; 速度アップ
643
+ :- (update world :speed dec) ; 速度ダウン
644
+ world))
645
+ ```
646
+
647
+ ### 関数型 GUI の特徴
648
+
649
+ Quil の `fun-mode` は関数型プログラミングの原則に従います:
650
+
651
+ 1. **状態の不変性**: 各フレームで新しい状態を返す
652
+ 2. **純粋な更新関数**: 副作用なしで状態を変換
653
+ 3. **描画と状態の分離**: `update` と `draw` は独立
654
+
655
+ ```clojure
656
+ ;; 状態は常に新しいマップとして返される
657
+ (defn update-state [state]
658
+ (if (:paused state)
659
+ state
660
+ (-> state
661
+ (update :world world/tick)
662
+ (update :generation inc))))
663
+ ```
664
+
665
+ ## 11. 関数型アプローチの特徴
666
+
667
+ ### 不変性
668
+
669
+ すべての状態更新は新しいワールドを返します。
670
+
671
+ ```clojure
672
+ ;; 元のワールドは変更されない
673
+ (def w1 (world/make 5 5))
674
+ (def w2 (world/tick w1))
675
+
676
+ ;; w1 と w2 は独立
677
+ (= w1 w2) ;; => false
678
+ ```
679
+
680
+ ### マルチメソッドによる拡張性
681
+
682
+ 新しいセルタイプの追加が容易です。
683
+
684
+ ```clojure
685
+ ;; 新しいセルタイプ: 海藻
686
+ (defmethod cell/tick ::seaweed
687
+ [seaweed loc world]
688
+ ;; 海藻のティック処理
689
+ ...)
690
+
691
+ (defmethod cell/display ::seaweed
692
+ [_seaweed]
693
+ "~")
694
+ ```
695
+
696
+ ### テスト容易性
697
+
698
+ 純粋関数であるため、テストが簡単です。
699
+
700
+ ```clojure
701
+ (describe "魚"
702
+ (it "繁殖可能年齢に達したら繁殖する"
703
+ (let [old-fish (-> (fish/make)
704
+ (animal/set-age 6))
705
+ world (-> (world/make 3 3)
706
+ (world/set-cell [1 1] old-fish))]
707
+ ;; テストロジック
708
+ )))
709
+ ```
710
+
711
+ ## まとめ
712
+
713
+ 本章では、Wa-Tor シミュレーションを通じて以下を学びました:
714
+
715
+ 1. **セルオートマトン**: グリッドベースのシミュレーション
716
+ 2. **マルチメソッド**: セルタイプによる多態的な振る舞い
717
+ 3. **トーラス型ワールド**: 端のラップ処理
718
+ 4. **捕食者-被食者モデル**: 繁殖、捕食、餓死のルール
719
+ 5. **段階的な実装**: Phase 1-13 での漸進的な開発
720
+ 6. **GUI との統合**: Quil による視覚化と関数型 GUI パターン
721
+
722
+ ## 参考コード
723
+
724
+ 本章のコード例は以下のファイルで確認できます:
725
+
726
+ - ソースコード: `apps/clojure/part6/src/wator/`
727
+ - テストコード: `apps/clojure/part6/spec/wator/`
728
+
729
+ ## 第6部のまとめ
730
+
731
+ 第6部では、5つのケーススタディを通じて関数型プログラミングの実践的な応用を学びました:
732
+
733
+ - **ゴシップ好きなバスの運転手**: 無限シーケンスと集合演算
734
+ - **給与計算システム**: ドメインモデリングとマルチメソッド
735
+ - **レンタルビデオシステム**: ポリシーパターンとフォーマッター
736
+ - **並行処理システム**: エージェントとイベント駆動
737
+ - **Wa-Tor シミュレーション**: セルオートマトンと多態性
738
+
739
+ これらのケーススタディを通じて、関数型プログラミングが実世界の問題に対してどのように適用できるかを理解しました。