@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,959 @@
1
+ # Part V: 並行処理
2
+
3
+ 本章では、関数型プログラミングにおける並行処理を学びます。Ref による安全な共有状態管理、Fiber による軽量スレッド、そして並列 IO 操作の構築方法を習得します。
4
+
5
+ ---
6
+
7
+ ## 第10章: 並行・並列処理
8
+
9
+ ### 10.1 並行処理の課題
10
+
11
+ 従来の並行処理には多くの課題があります:
12
+
13
+ - デッドロック
14
+ - 競合状態(Race Condition)
15
+ - 共有状態の管理の複雑さ
16
+ - スレッドのオーバーヘッド
17
+
18
+ ```plantuml
19
+ @startuml
20
+ !theme plain
21
+
22
+ rectangle "従来の並行処理の問題" {
23
+ rectangle "問題" as problems {
24
+ card "デッドロック"
25
+ card "競合状態"
26
+ card "可変状態の共有"
27
+ card "スレッド管理"
28
+ }
29
+
30
+ rectangle "関数型の解決策" as solutions {
31
+ card "イミュータブルデータ"
32
+ card "Ref(アトミック参照)"
33
+ card "Fiber(軽量スレッド)"
34
+ card "宣言的な並行処理"
35
+ }
36
+ }
37
+
38
+ problems --> solutions : 関数型アプローチ
39
+
40
+ @enduml
41
+ ```
42
+
43
+ ### 10.2 チェックインのリアルタイム集計
44
+
45
+ **ソースファイル**: `app/java/src/main/java/ch10/CheckIns.java`
46
+
47
+ 都市へのチェックインをリアルタイムで集計し、ランキングを更新する例を見ていきます。
48
+
49
+ ```java
50
+ public record City(String name) {}
51
+ public record CityStats(City city, int checkIns) {}
52
+
53
+ // サンプルのチェックインデータを生成
54
+ public static List<City> sampleCheckIns(int repeatCount) {
55
+ List<City> cities = List.of(
56
+ new City("Sydney"),
57
+ new City("Dublin"),
58
+ new City("Cape Town"),
59
+ new City("Lima"),
60
+ new City("Singapore")
61
+ );
62
+
63
+ return List.range(0, repeatCount)
64
+ .flatMap(i -> cities);
65
+ }
66
+ ```
67
+
68
+ #### トップ N 都市の計算(純粋関数)
69
+
70
+ ```java
71
+ public static List<CityStats> topCities(Map<City, Integer> cityCheckIns, int n) {
72
+ return cityCheckIns.toList()
73
+ .map(t -> new CityStats(t._1(), t._2()))
74
+ .sortBy(stats -> -stats.checkIns()) // 降順
75
+ .take(n);
76
+ }
77
+ ```
78
+
79
+ ### 10.3 逐次処理の問題
80
+
81
+ 最初の実装は逐次処理で、シンプルですがパフォーマンスに問題があります。
82
+
83
+ ```java
84
+ public static IO<List<CityStats>> processCheckInsSequential(List<City> checkIns, int topN) {
85
+ return IO.delay(() -> {
86
+ Map<City, Integer> cityCheckIns = checkIns.foldLeft(
87
+ HashMap.<City, Integer>empty(),
88
+ CheckIns::updateCheckIns
89
+ );
90
+ return topCities(cityCheckIns, topN);
91
+ });
92
+ }
93
+
94
+ public static Map<City, Integer> updateCheckIns(Map<City, Integer> current, City city) {
95
+ return current.put(city, current.get(city).map(c -> c + 1).getOrElse(1));
96
+ }
97
+ ```
98
+
99
+ ```plantuml
100
+ @startuml
101
+ !theme plain
102
+
103
+ rectangle "逐次処理の問題" {
104
+ card "チェックイン1" as c1
105
+ card "チェックイン2" as c2
106
+ card "チェックイン3" as c3
107
+ card "..." as dots
108
+
109
+ c1 --> c2 : 待機
110
+ c2 --> c3 : 待機
111
+ c3 --> dots : 待機
112
+ }
113
+
114
+ note bottom
115
+ 各チェックインが完了するまで
116
+ 次の処理が始まらない
117
+ end note
118
+
119
+ @enduml
120
+ ```
121
+
122
+ ### 10.4 Ref - アトミックな共有状態
123
+
124
+ **ソースファイル**: `app/java/src/main/java/ch10/Ref.java`
125
+
126
+ **Ref** は、複数の並行処理から安全にアクセスできるアトミックな参照です。Java の `AtomicReference` をラップし、IO モナドと統合しています。
127
+
128
+ ```java
129
+ public final class Ref<A> {
130
+
131
+ private final AtomicReference<A> value;
132
+
133
+ private Ref(A initial) {
134
+ this.value = new AtomicReference<>(initial);
135
+ }
136
+
137
+ // 初期値で Ref を作成(IO でラップ)
138
+ public static <A> IO<Ref<A>> of(A initial) {
139
+ return IO.delay(() -> new Ref<>(initial));
140
+ }
141
+
142
+ // 現在の値を取得
143
+ public IO<A> get() {
144
+ return IO.delay(value::get);
145
+ }
146
+
147
+ // 値を設定
148
+ public IO<Void> set(A newValue) {
149
+ return IO.effect(() -> value.set(newValue));
150
+ }
151
+
152
+ // アトミックに値を更新
153
+ public IO<Void> update(UnaryOperator<A> f) {
154
+ return IO.effect(() -> value.updateAndGet(f));
155
+ }
156
+ }
157
+ ```
158
+
159
+ #### Ref の使用例
160
+
161
+ ```java
162
+ // Ref の作成と使用
163
+ IO<Integer> program = Ref.of(0)
164
+ .flatMap(counter ->
165
+ counter.update(x -> x + 3) // アトミックに更新
166
+ .andThen(counter.get()) // 現在の値を取得
167
+ );
168
+
169
+ program.unsafeRun(); // 3
170
+ ```
171
+
172
+ ```plantuml
173
+ @startuml
174
+ !theme plain
175
+
176
+ rectangle "Ref の操作" {
177
+ card "Ref.of(0)" as create
178
+ card "counter.update(x -> x + 3)" as update
179
+ card "counter.get()" as get
180
+
181
+ create --> update : 作成
182
+ update --> get : 更新
183
+ }
184
+
185
+ note bottom of update
186
+ update はアトミック
187
+ 他の処理と競合しない
188
+ end note
189
+
190
+ @enduml
191
+ ```
192
+
193
+ #### Ref の主要メソッド
194
+
195
+ | メソッド | 説明 | 例 |
196
+ |----------|------|-----|
197
+ | `Ref.of(initial)` | 初期値で Ref を作成 | `Ref.of(0)` |
198
+ | `ref.get()` | 現在の値を取得 | `counter.get()` |
199
+ | `ref.set(value)` | 値を設定 | `counter.set(10)` |
200
+ | `ref.update(f)` | アトミックに更新 | `counter.update(x -> x + 1)` |
201
+ | `ref.modify(f)` | 更新して結果を返す | `counter.modify(n -> ModifyResult.of(n + 1, n))` |
202
+ | `ref.getAndUpdate(f)` | 古い値を返して更新 | `counter.getAndUpdate(x -> x * 2)` |
203
+ | `ref.updateAndGet(f)` | 更新して新しい値を返す | `counter.updateAndGet(x -> x * 2)` |
204
+
205
+ #### modify の使用例
206
+
207
+ `modify` は値を更新しつつ、何か別の値を返したい場合に便利です。
208
+
209
+ ```java
210
+ Ref<Integer> ref = Ref.unsafe(10);
211
+ String result = ref.modify(x ->
212
+ Ref.ModifyResult.of(x + 1, "was " + x)
213
+ ).unsafeRun();
214
+
215
+ // result: "was 10"
216
+ // ref の値: 11
217
+ ```
218
+
219
+ ### 10.5 ParallelIO - 並列実行
220
+
221
+ **ソースファイル**: `app/java/src/main/java/ch10/ParallelIO.java`
222
+
223
+ `IO.sequence` は IO を順番に実行しますが、`ParallelIO.parSequence` は並列に実行します。
224
+
225
+ ```java
226
+ public final class ParallelIO {
227
+
228
+ private static final ExecutorService executor =
229
+ Executors.newVirtualThreadPerTaskExecutor();
230
+
231
+ // IO のリストを並列に実行
232
+ public static <A> IO<List<A>> parSequence(List<IO<A>> ios) {
233
+ return IO.delay(() -> {
234
+ // 各 IO を CompletableFuture として非同期実行
235
+ java.util.List<CompletableFuture<A>> futures = ios
236
+ .map(io -> CompletableFuture.supplyAsync(io::unsafeRun, executor))
237
+ .toJavaList();
238
+
239
+ // すべての完了を待機
240
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
241
+
242
+ // 結果を収集
243
+ return List.ofAll(futures.stream().map(CompletableFuture::join).toList());
244
+ });
245
+ }
246
+ }
247
+ ```
248
+
249
+ ```plantuml
250
+ @startuml
251
+ !theme plain
252
+
253
+ rectangle "sequence vs parSequence" {
254
+ rectangle "sequence(順次)" as seq {
255
+ card "IO1" as s1
256
+ card "IO2" as s2
257
+ card "IO3" as s3
258
+ s1 --> s2
259
+ s2 --> s3
260
+ }
261
+
262
+ rectangle "parSequence(並列)" as par {
263
+ card "IO1" as p1
264
+ card "IO2" as p2
265
+ card "IO3" as p3
266
+ }
267
+ }
268
+
269
+ note bottom of seq
270
+ 合計時間 = IO1 + IO2 + IO3
271
+ end note
272
+
273
+ note bottom of par
274
+ 合計時間 ≈ max(IO1, IO2, IO3)
275
+ end note
276
+
277
+ @enduml
278
+ ```
279
+
280
+ #### 並列実行の効果
281
+
282
+ ```java
283
+ List<IO<Integer>> ios = List.of(
284
+ Fiber.sleep(100).andThen(IO.pure(1)),
285
+ Fiber.sleep(100).andThen(IO.pure(2)),
286
+ Fiber.sleep(100).andThen(IO.pure(3))
287
+ );
288
+
289
+ long start = System.currentTimeMillis();
290
+ ParallelIO.parSequence(ios).unsafeRun();
291
+ long elapsed = System.currentTimeMillis() - start;
292
+
293
+ // 並列なので約100ms(順次なら約300ms)
294
+ assertThat(elapsed).isLessThan(200);
295
+ ```
296
+
297
+ #### parTraverse
298
+
299
+ `parTraverse` は、リストの各要素に IO を返す関数を適用し、並列に実行します。
300
+
301
+ ```java
302
+ public static <A, B> IO<List<B>> parTraverse(
303
+ List<A> list,
304
+ Function<A, IO<B>> f) {
305
+ return parSequence(list.map(f));
306
+ }
307
+
308
+ // 使用例
309
+ List<Integer> numbers = List.of(1, 2, 3, 4, 5);
310
+
311
+ List<Integer> result = ParallelIO.parTraverse(
312
+ numbers,
313
+ n -> IO.pure(n * 2)
314
+ ).unsafeRun(); // List(2, 4, 6, 8, 10)
315
+ ```
316
+
317
+ ### 10.6 チェックイン処理の並行版
318
+
319
+ Ref と ParallelIO を組み合わせて、チェックインを並行処理します。
320
+
321
+ #### チェックインの保存
322
+
323
+ ```java
324
+ public static IO<Void> storeCheckIn(
325
+ Ref<Map<City, Integer>> storedCheckIns,
326
+ City city) {
327
+ return storedCheckIns.update(current -> updateCheckIns(current, city));
328
+ }
329
+ ```
330
+
331
+ #### 並行処理版
332
+
333
+ ```java
334
+ public static IO<List<CityStats>> processCheckInsConcurrent(
335
+ List<City> checkIns,
336
+ int topN) {
337
+ return Ref.<Map<City, Integer>>of(HashMap.empty())
338
+ .flatMap(storedCheckIns ->
339
+ // すべてのチェックインを並列に処理
340
+ ParallelIO.parTraverse(checkIns, city ->
341
+ storeCheckIn(storedCheckIns, city))
342
+ .andThen(storedCheckIns.get())
343
+ .map(cityCheckIns -> topCities(cityCheckIns, topN))
344
+ );
345
+ }
346
+ ```
347
+
348
+ ```plantuml
349
+ @startuml
350
+ !theme plain
351
+
352
+ rectangle "並行処理の構造" {
353
+ rectangle "チェックイン処理" as checkin {
354
+ card "parTraverse でチェックインを並列処理"
355
+ card "Ref にアトミックに保存"
356
+ }
357
+
358
+ rectangle "結果取得" as result {
359
+ card "Ref からデータを読み取り"
360
+ card "ランキングを計算"
361
+ }
362
+ }
363
+
364
+ checkin --> result
365
+
366
+ note bottom
367
+ 複数のチェックインが
368
+ 並列に処理される
369
+ end note
370
+
371
+ @enduml
372
+ ```
373
+
374
+ ### 10.7 parTuple と parMap
375
+
376
+ 複数の IO を並列に実行して結果を組み合わせる便利なメソッドです。
377
+
378
+ #### parTuple2 / parTuple3
379
+
380
+ ```java
381
+ // 2つの IO を並列実行し、タプルで返す
382
+ Tuple2<Integer, String> result = ParallelIO.parTuple2(
383
+ IO.pure(42),
384
+ IO.pure("hello")
385
+ ).unsafeRun();
386
+
387
+ // result._1(): 42
388
+ // result._2(): "hello"
389
+
390
+ // 3つの IO も同様
391
+ var result3 = ParallelIO.parTuple3(
392
+ IO.pure(1),
393
+ IO.pure("two"),
394
+ IO.pure(3.0)
395
+ ).unsafeRun();
396
+ ```
397
+
398
+ #### parMap2
399
+
400
+ ```java
401
+ // 2つの IO を並列実行して結果を結合
402
+ IO<Integer> result = ParallelIO.parMap2(
403
+ IO.pure(10),
404
+ IO.pure(20),
405
+ Integer::sum
406
+ );
407
+
408
+ result.unsafeRun(); // 30
409
+ ```
410
+
411
+ ### 10.8 race と timeout
412
+
413
+ #### race - 競争
414
+
415
+ 2つの IO を並列に実行し、最初に完了した方の結果を返します。
416
+
417
+ ```java
418
+ public static <A> IO<A> race(IO<A> io1, IO<A> io2) {
419
+ return IO.delay(() -> {
420
+ CompletableFuture<A> f1 = CompletableFuture.supplyAsync(io1::unsafeRun, executor);
421
+ CompletableFuture<A> f2 = CompletableFuture.supplyAsync(io2::unsafeRun, executor);
422
+
423
+ return CompletableFuture.anyOf(f1, f2)
424
+ .thenApply(result -> {
425
+ f1.cancel(true);
426
+ f2.cancel(true);
427
+ @SuppressWarnings("unchecked")
428
+ A typedResult = (A) result;
429
+ return typedResult;
430
+ })
431
+ .join();
432
+ });
433
+ }
434
+
435
+ // 使用例
436
+ IO<String> slow = Fiber.sleep(200).andThen(IO.pure("slow"));
437
+ IO<String> fast = Fiber.sleep(50).andThen(IO.pure("fast"));
438
+
439
+ String result = ParallelIO.race(slow, fast).unsafeRun();
440
+ // result: "fast"
441
+ ```
442
+
443
+ #### timeout - タイムアウト
444
+
445
+ ```java
446
+ public static <A> IO<Option<A>> timeout(IO<A> action, long millis) {
447
+ return IO.delay(() -> {
448
+ CompletableFuture<A> future =
449
+ CompletableFuture.supplyAsync(action::unsafeRun, executor);
450
+
451
+ try {
452
+ A result = future.get(millis, TimeUnit.MILLISECONDS);
453
+ return Option.some(result);
454
+ } catch (TimeoutException e) {
455
+ future.cancel(true);
456
+ return Option.none();
457
+ } catch (Exception e) {
458
+ throw new RuntimeException(e);
459
+ }
460
+ });
461
+ }
462
+
463
+ // 使用例
464
+ IO<Integer> fast = Fiber.sleep(50).andThen(IO.pure(42));
465
+ Option<Integer> result1 = ParallelIO.timeout(fast, 200).unsafeRun();
466
+ // result1: Some(42)
467
+
468
+ IO<Integer> slow = Fiber.sleep(500).andThen(IO.pure(42));
469
+ Option<Integer> result2 = ParallelIO.timeout(slow, 100).unsafeRun();
470
+ // result2: None
471
+ ```
472
+
473
+ ### 10.9 Fiber - 軽量スレッド
474
+
475
+ **ソースファイル**: `app/java/src/main/java/ch10/Fiber.java`
476
+
477
+ **Fiber** は、IO の実行をバックグラウンドで行う軽量な実行単位です。Java 21 の仮想スレッド(Virtual Thread)を活用しています。
478
+
479
+ ```plantuml
480
+ @startuml
481
+ !theme plain
482
+
483
+ rectangle "Thread vs Fiber" {
484
+ rectangle "OS Thread" as thread {
485
+ card "重い(MB単位のメモリ)"
486
+ card "OS が管理"
487
+ card "数千程度が限界"
488
+ }
489
+
490
+ rectangle "Fiber (Virtual Thread)" as fiber {
491
+ card "軽い(KB単位のメモリ)"
492
+ card "JVM が管理"
493
+ card "数百万も可能"
494
+ }
495
+ }
496
+
497
+ @enduml
498
+ ```
499
+
500
+ #### Fiber の実装
501
+
502
+ ```java
503
+ public final class Fiber<A> {
504
+
505
+ private static final ExecutorService executor =
506
+ Executors.newVirtualThreadPerTaskExecutor();
507
+
508
+ private final CompletableFuture<A> future;
509
+ private final AtomicBoolean cancelled;
510
+ private final Future<?> task;
511
+
512
+ // IO をバックグラウンドで起動し、Fiber を返す
513
+ public static <A> IO<Fiber<A>> start(IO<A> io) {
514
+ return IO.delay(() -> {
515
+ CompletableFuture<A> future = new CompletableFuture<>();
516
+ AtomicBoolean cancelled = new AtomicBoolean(false);
517
+
518
+ Future<?> task = executor.submit(() -> {
519
+ try {
520
+ if (!cancelled.get()) {
521
+ A result = io.unsafeRun();
522
+ if (!cancelled.get()) {
523
+ future.complete(result);
524
+ }
525
+ }
526
+ } catch (Exception e) {
527
+ if (!cancelled.get()) {
528
+ future.completeExceptionally(e);
529
+ }
530
+ }
531
+ });
532
+
533
+ return new Fiber<>(future, cancelled, task);
534
+ });
535
+ }
536
+ }
537
+ ```
538
+
539
+ #### Fiber の起動とキャンセル
540
+
541
+ ```java
542
+ AtomicInteger counter = new AtomicInteger(0);
543
+
544
+ // 無限ループする IO をバックグラウンドで起動
545
+ Fiber<Void> fiber = Fiber.startForever(
546
+ Fiber.sleep(10).andThen(IO.effect(counter::incrementAndGet))
547
+ ).unsafeRun();
548
+
549
+ // しばらく実行
550
+ Thread.sleep(100);
551
+ int countBefore = counter.get();
552
+ assertThat(countBefore).isGreaterThan(0);
553
+
554
+ // キャンセル
555
+ fiber.cancel().unsafeRun();
556
+ Thread.sleep(50);
557
+
558
+ int countAfter = counter.get();
559
+ // キャンセル後は増加しない
560
+ assertThat(fiber.isCancelled()).isTrue();
561
+ ```
562
+
563
+ #### Fiber の主要メソッド
564
+
565
+ | メソッド | 説明 | 例 |
566
+ |----------|------|-----|
567
+ | `Fiber.start(io)` | IO をバックグラウンドで起動 | `Fiber.start(IO.pure(42))` |
568
+ | `Fiber.startForever(io)` | 無限ループで起動 | `Fiber.startForever(process)` |
569
+ | `fiber.join()` | 完了を待機し結果を取得 | `fiber.join().unsafeRun()` |
570
+ | `fiber.cancel()` | Fiber をキャンセル | `fiber.cancel().unsafeRun()` |
571
+ | `fiber.isDone()` | 完了したか | `fiber.isDone()` |
572
+ | `fiber.isCancelled()` | キャンセルされたか | `fiber.isCancelled()` |
573
+ | `Fiber.sleep(millis)` | 指定時間スリープ | `Fiber.sleep(100)` |
574
+ | `Fiber.delay(millis, io)` | 遅延実行 | `Fiber.delay(100, IO.pure(42))` |
575
+
576
+ ### 10.10 呼び出し元に制御を返す
577
+
578
+ Fiber を使って、呼び出し元にすぐ制御を返しつつバックグラウンドで処理を続ける設計ができます。
579
+
580
+ ```java
581
+ public record ProcessingCheckIns(
582
+ IO<List<CityStats>> currentRanking, // 現在のランキングを取得
583
+ IO<Void> stop // 処理を停止
584
+ ) {}
585
+
586
+ public static IO<ProcessingCheckIns> processCheckInsBackground(
587
+ List<City> checkIns,
588
+ int topN,
589
+ long updateIntervalMillis) {
590
+
591
+ return Ref.<Map<City, Integer>>of(HashMap.empty())
592
+ .flatMap(storedCheckIns ->
593
+ Ref.<List<CityStats>>of(List.empty())
594
+ .flatMap(storedRanking -> {
595
+ // チェックイン処理プログラム
596
+ IO<Void> checkInsProgram = IO.traverse(
597
+ checkIns,
598
+ city -> storeCheckIn(storedCheckIns, city)
599
+ ).map(ignored -> null);
600
+
601
+ // ランキング更新プログラム(定期的に実行)
602
+ IO<Void> rankingProgram = IO.delay(() -> {
603
+ updateRanking(storedCheckIns, storedRanking, topN)
604
+ .unsafeRun();
605
+ return null;
606
+ });
607
+
608
+ // Fiber として起動し、すぐに戻る
609
+ return Fiber.start(checkInsProgram)
610
+ .flatMap(checkInsFiber ->
611
+ Fiber.startForever(
612
+ Fiber.sleep(updateIntervalMillis)
613
+ .andThen(rankingProgram)
614
+ ).map(rankingFiber ->
615
+ new ProcessingCheckIns(
616
+ storedRanking.get(),
617
+ checkInsFiber.cancel()
618
+ .andThen(rankingFiber.cancel())
619
+ )
620
+ )
621
+ );
622
+ })
623
+ );
624
+ }
625
+ ```
626
+
627
+ ```plantuml
628
+ @startuml
629
+ !theme plain
630
+
631
+ rectangle "制御の流れ" {
632
+ card "processCheckInsBackground 呼び出し" as call
633
+ card "Ref の初期化" as init
634
+ card "Fiber の起動" as start
635
+ card "ProcessingCheckIns を返す" as return
636
+
637
+ call --> init
638
+ init --> start
639
+ start --> return : すぐに戻る
640
+
641
+ rectangle "バックグラウンド" as bg {
642
+ card "チェックイン処理" as checkin
643
+ card "ランキング更新" as ranking
644
+ }
645
+
646
+ start --> bg : 並行実行
647
+ }
648
+
649
+ @enduml
650
+ ```
651
+
652
+ ### 10.11 parFold - 並列実行して集約
653
+
654
+ ```java
655
+ public static <A, B> IO<B> parFold(
656
+ List<IO<A>> ios,
657
+ B initial,
658
+ BiFunction<B, A, B> f) {
659
+ return parSequence(ios).map(results -> results.foldLeft(initial, f));
660
+ }
661
+
662
+ // 使用例
663
+ List<IO<Integer>> ios = List.of(
664
+ IO.pure(1),
665
+ IO.pure(2),
666
+ IO.pure(3),
667
+ IO.pure(4)
668
+ );
669
+
670
+ Integer sum = ParallelIO.parFold(ios, 0, Integer::sum).unsafeRun();
671
+ // sum: 10
672
+ ```
673
+
674
+ ### 10.12 Java 21 Virtual Thread の活用
675
+
676
+ この実装では Java 21 の仮想スレッド(Virtual Thread)を活用しています。
677
+
678
+ ```java
679
+ private static final ExecutorService executor =
680
+ Executors.newVirtualThreadPerTaskExecutor();
681
+ ```
682
+
683
+ 仮想スレッドの利点:
684
+
685
+ - **軽量**: 従来のプラットフォームスレッドより遥かに軽量
686
+ - **スケーラブル**: 数百万の同時実行が可能
687
+ - **ブロッキング OK**: ブロッキング操作でもスレッドプールを枯渇させない
688
+ - **既存コードと互換**: 既存の Java コードをそのまま使用可能
689
+
690
+ ---
691
+
692
+ ## まとめ
693
+
694
+ ### Part V で学んだこと
695
+
696
+ ```plantuml
697
+ @startuml
698
+ !theme plain
699
+
700
+ rectangle "Part V: 並行処理" {
701
+ rectangle "第10章" as ch10 {
702
+ card "Ref(アトミック参照)"
703
+ card "ParallelIO(並列実行)"
704
+ card "Fiber(軽量スレッド)"
705
+ card "race / timeout"
706
+ card "Virtual Thread"
707
+ }
708
+ }
709
+
710
+ @enduml
711
+ ```
712
+
713
+ ### 主要コンポーネント
714
+
715
+ | コンポーネント | 用途 |
716
+ |----------------|------|
717
+ | `Ref<A>` | スレッドセーフな共有状態 |
718
+ | `ParallelIO.parSequence` | IO のリストを並列実行 |
719
+ | `ParallelIO.parTraverse` | リストに関数を適用して並列実行 |
720
+ | `ParallelIO.race` | 最初に完了した方を返す |
721
+ | `ParallelIO.timeout` | タイムアウト付き実行 |
722
+ | `Fiber` | 軽量な実行単位 |
723
+ | `fiber.start` | Fiber をバックグラウンドで起動 |
724
+ | `fiber.cancel` | Fiber をキャンセル |
725
+
726
+ ### キーポイント
727
+
728
+ 1. **Ref**: `AtomicReference` をラップし、IO モナドと統合したアトミックな参照
729
+ 2. **parSequence**: IO のリストを並列実行して結果を集約
730
+ 3. **Fiber**: Java 21 の仮想スレッドを活用した軽量な実行単位
731
+ 4. **start**: Fiber をバックグラウンドで起動し、すぐに制御を返す
732
+ 5. **race**: 2つの IO を競争させ、最初に完了した方を採用
733
+ 6. **timeout**: 指定時間内に完了しなければ None を返す
734
+
735
+ ### 設計パターン
736
+
737
+ ```plantuml
738
+ @startuml
739
+ !theme plain
740
+
741
+ rectangle "並行処理の設計パターン" {
742
+ rectangle "パターン1: 並列集約" as p1 {
743
+ card "複数の IO を並列実行"
744
+ card "parSequence / parTraverse"
745
+ card "結果を集約"
746
+ }
747
+
748
+ rectangle "パターン2: 共有状態" as p2 {
749
+ card "Ref で状態を共有"
750
+ card "複数の処理がアトミックに更新"
751
+ }
752
+
753
+ rectangle "パターン3: バックグラウンド処理" as p3 {
754
+ card "Fiber.start で起動"
755
+ card "制御を返す"
756
+ card "後で結果を取得/停止"
757
+ }
758
+
759
+ rectangle "パターン4: 競争/タイムアウト" as p4 {
760
+ card "race で最速を採用"
761
+ card "timeout で時間制限"
762
+ }
763
+ }
764
+
765
+ @enduml
766
+ ```
767
+
768
+ ### Scala との比較
769
+
770
+ | 概念 | Scala (cats-effect) | Java + Vavr |
771
+ |------|---------------------|-------------|
772
+ | アトミック参照 | `Ref[IO, A]` | `Ref<A>` (独自実装) |
773
+ | 並列実行 | `parSequence` | `ParallelIO.parSequence` |
774
+ | 軽量スレッド | `Fiber[IO, A]` | `Fiber<A>` (Virtual Thread) |
775
+ | Fiber 起動 | `io.start` | `Fiber.start(io)` |
776
+ | キャンセル | `fiber.cancel` | `fiber.cancel()` |
777
+ | 競争 | `IO.race(io1, io2)` | `ParallelIO.race(io1, io2)` |
778
+ | タイムアウト | `io.timeout(duration)` | `ParallelIO.timeout(io, millis)` |
779
+
780
+ ---
781
+
782
+ ## 演習問題
783
+
784
+ ### 問題 1: Ref の基本
785
+
786
+ 以下のプログラムを実装してください。カウンターを 0 から始めて、3回インクリメントした結果を返します。
787
+
788
+ ```java
789
+ public static IO<Integer> incrementThreeTimes() {
790
+ // ???
791
+ }
792
+
793
+ // 期待される動作
794
+ incrementThreeTimes().unsafeRun(); // 3
795
+ ```
796
+
797
+ <details>
798
+ <summary>解答</summary>
799
+
800
+ ```java
801
+ public static IO<Integer> incrementThreeTimes() {
802
+ return Ref.of(0)
803
+ .flatMap(counter ->
804
+ counter.update(x -> x + 1)
805
+ .andThen(counter.update(x -> x + 1))
806
+ .andThen(counter.update(x -> x + 1))
807
+ .andThen(counter.get())
808
+ );
809
+ }
810
+ ```
811
+
812
+ </details>
813
+
814
+ ### 問題 2: 並列実行
815
+
816
+ 以下のプログラムを実装してください。3つの IO を並列実行し、結果の合計を返します。
817
+
818
+ ```java
819
+ public static IO<Integer> sumParallel(IO<Integer> io1, IO<Integer> io2, IO<Integer> io3) {
820
+ // ???
821
+ }
822
+
823
+ // 期待される動作
824
+ sumParallel(IO.pure(1), IO.pure(2), IO.pure(3)).unsafeRun(); // 6
825
+ ```
826
+
827
+ <details>
828
+ <summary>解答</summary>
829
+
830
+ ```java
831
+ public static IO<Integer> sumParallel(IO<Integer> io1, IO<Integer> io2, IO<Integer> io3) {
832
+ return ParallelIO.parSequence(List.of(io1, io2, io3))
833
+ .map(list -> list.foldLeft(0, Integer::sum));
834
+ }
835
+
836
+ // または parFold を使用
837
+ public static IO<Integer> sumParallel(IO<Integer> io1, IO<Integer> io2, IO<Integer> io3) {
838
+ return ParallelIO.parFold(List.of(io1, io2, io3), 0, Integer::sum);
839
+ }
840
+ ```
841
+
842
+ </details>
843
+
844
+ ### 問題 3: 並行カウント
845
+
846
+ 以下のプログラムを実装してください。IO のリストを並行実行し、そのうち偶数を返した回数をカウントします。
847
+
848
+ ```java
849
+ public static IO<Integer> countEvens(List<IO<Integer>> ios) {
850
+ // ???
851
+ }
852
+
853
+ // 使用例
854
+ List<IO<Integer>> ios = List.range(0, 100).map(IO::pure);
855
+ countEvens(ios).unsafeRun(); // 50
856
+ ```
857
+
858
+ <details>
859
+ <summary>解答</summary>
860
+
861
+ ```java
862
+ public static IO<Integer> countEvens(List<IO<Integer>> ios) {
863
+ return Ref.of(0)
864
+ .flatMap(counter ->
865
+ ParallelIO.parTraverse(ios, io ->
866
+ io.flatMap(n ->
867
+ n % 2 == 0
868
+ ? counter.update(x -> x + 1)
869
+ : IO.unit()
870
+ )
871
+ ).andThen(counter.get())
872
+ );
873
+ }
874
+ ```
875
+
876
+ </details>
877
+
878
+ ### 問題 4: タイムアウト付き実行
879
+
880
+ 以下のプログラムを実装してください。指定時間後に Fiber をキャンセルし、それまでに蓄積された結果を返します。
881
+
882
+ ```java
883
+ public static IO<List<Integer>> collectFor(long durationMillis) {
884
+ // 100msごとに乱数を生成してリストに追加
885
+ // 指定時間後に停止して結果を返す
886
+ // ???
887
+ }
888
+
889
+ // 期待される動作
890
+ // 1秒間実行すると約10個の要素が返される
891
+ collectFor(1000).unsafeRun();
892
+ ```
893
+
894
+ <details>
895
+ <summary>解答</summary>
896
+
897
+ ```java
898
+ public static IO<List<Integer>> collectFor(long durationMillis) {
899
+ return Ref.<List<Integer>>of(List.empty())
900
+ .flatMap(collected -> {
901
+ Random random = new Random();
902
+
903
+ // 100msごとに乱数を追加するプログラム
904
+ IO<Void> producer = Fiber.sleep(100)
905
+ .andThen(IO.delay(() -> random.nextInt(100)))
906
+ .flatMap(n -> collected.update(list -> list.append(n)));
907
+
908
+ return Fiber.startForever(producer)
909
+ .flatMap(fiber ->
910
+ Fiber.sleep(durationMillis)
911
+ .andThen(fiber.cancel())
912
+ .andThen(collected.get())
913
+ );
914
+ });
915
+ }
916
+ ```
917
+
918
+ </details>
919
+
920
+ ### 問題 5: 並行マップ更新
921
+
922
+ 以下のプログラムを実装してください。複数の更新を並行して Map に適用し、最終的な Map を返します。
923
+
924
+ ```java
925
+ record Update(String key, int value) {}
926
+
927
+ public static IO<Map<String, Integer>> applyUpdates(List<Update> updates) {
928
+ // ???
929
+ }
930
+
931
+ // 期待される動作
932
+ List<Update> updates = List.of(
933
+ new Update("a", 1),
934
+ new Update("b", 2),
935
+ new Update("a", 3), // "a" を上書き
936
+ new Update("c", 4)
937
+ );
938
+ applyUpdates(updates).unsafeRun(); // HashMap(a -> 3, b -> 2, c -> 4)
939
+ ```
940
+
941
+ <details>
942
+ <summary>解答</summary>
943
+
944
+ ```java
945
+ record Update(String key, int value) {}
946
+
947
+ public static IO<Map<String, Integer>> applyUpdates(List<Update> updates) {
948
+ return Ref.<Map<String, Integer>>of(HashMap.empty())
949
+ .flatMap(mapRef ->
950
+ ParallelIO.parTraverse(updates, update ->
951
+ mapRef.update(m -> m.put(update.key(), update.value()))
952
+ ).andThen(mapRef.get())
953
+ );
954
+ }
955
+ ```
956
+
957
+ 注意: 並行実行なので、同じキーへの複数の更新がある場合、最終的な値は実行順序に依存します。
958
+
959
+ </details>