@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,771 @@
1
+ # Part IV: IO と副作用の管理
2
+
3
+ 本章では、関数型プログラミングにおける副作用の扱い方を学びます。IO モナドを使って副作用を純粋関数内で安全に記述し、ストリーム処理で無限のデータを扱う方法を習得します。
4
+
5
+ ---
6
+
7
+ ## 第8章: IO モナドの導入
8
+
9
+ ### 8.1 副作用の問題
10
+
11
+ 純粋関数は副作用を持ちません。しかし、実際のプログラムには副作用が必要です:
12
+
13
+ - ファイルの読み書き
14
+ - ネットワーク通信
15
+ - データベースアクセス
16
+ - 乱数生成
17
+ - 現在時刻の取得
18
+
19
+ ```plantuml
20
+ @startuml
21
+ !theme plain
22
+
23
+ rectangle "副作用の問題" {
24
+ rectangle "副作用を持つ関数" as impure {
25
+ card "テストが困難"
26
+ card "予測不可能"
27
+ card "参照透過性がない"
28
+ }
29
+
30
+ rectangle "純粋関数" as pure {
31
+ card "テストが容易"
32
+ card "予測可能"
33
+ card "参照透過性がある"
34
+ }
35
+ }
36
+
37
+ note bottom
38
+ どうすれば副作用を
39
+ 純粋関数のように扱えるか?
40
+ end note
41
+
42
+ @enduml
43
+ ```
44
+
45
+ ### 8.2 IO モナドとは
46
+
47
+ **IO モナド**は「副作用を持つ計算の**記述**」を表す型です。
48
+
49
+ - `IO<A>` は「実行すると `A` 型の値を返す副作用のある計算」
50
+ - IO 値を作成しただけでは副作用は発生しない
51
+ - `unsafeRun()` で実際に実行される
52
+
53
+ ```plantuml
54
+ @startuml
55
+ !theme plain
56
+
57
+ rectangle "IO の仕組み" {
58
+ card "IO.delay(副作用)" as create
59
+ card "IO<A> 値" as io
60
+ card "unsafeRun()" as run
61
+ card "副作用が実行される" as effect
62
+
63
+ create --> io : 記述を作成
64
+ io --> run : 実行を指示
65
+ run --> effect : 実際に実行
66
+ }
67
+
68
+ note bottom of io
69
+ この時点では
70
+ 副作用は発生しない
71
+ end note
72
+
73
+ @enduml
74
+ ```
75
+
76
+ ### 8.3 IO の実装
77
+
78
+ **ソースファイル**: `app/java/src/main/java/ch08/IO.java`
79
+
80
+ Java + Vavr での IO モナドの簡易実装です:
81
+
82
+ ```java
83
+ public final class IO<A> {
84
+
85
+ private final Supplier<A> thunk;
86
+
87
+ private IO(Supplier<A> thunk) {
88
+ this.thunk = thunk;
89
+ }
90
+
91
+ // 副作用のある式を遅延実行する IO を作成
92
+ public static <A> IO<A> delay(Supplier<A> supplier) {
93
+ return new IO<>(supplier);
94
+ }
95
+
96
+ // 既存の値をラップ(副作用なし)
97
+ public static <A> IO<A> pure(A value) {
98
+ return new IO<>(() -> value);
99
+ }
100
+
101
+ // IO を実行して結果を取得(副作用が発生する)
102
+ public A unsafeRun() {
103
+ return thunk.get();
104
+ }
105
+
106
+ // 結果を変換する
107
+ public <B> IO<B> map(Function<A, B> f) {
108
+ return new IO<>(() -> f.apply(thunk.get()));
109
+ }
110
+
111
+ // IO を返す関数を適用してフラット化
112
+ public <B> IO<B> flatMap(Function<A, IO<B>> f) {
113
+ return new IO<>(() -> f.apply(thunk.get()).unsafeRun());
114
+ }
115
+ }
116
+ ```
117
+
118
+ ### 8.4 サイコロを振る例
119
+
120
+ **ソースファイル**: `app/java/src/main/java/ch08/CastingDie.java`
121
+
122
+ #### 不純な関数(副作用あり)
123
+
124
+ ```java
125
+ private static final Random random = new Random();
126
+
127
+ // 呼び出すたびに異なる値が返る
128
+ public static int castTheDieImpure() {
129
+ return random.nextInt(6) + 1;
130
+ }
131
+ ```
132
+
133
+ #### IO を使った純粋な記述
134
+
135
+ ```java
136
+ // サイコロを振る(IO でラップ)
137
+ // IO 値を作成しただけでは実行されない
138
+ public static IO<Integer> castTheDie() {
139
+ return IO.delay(CastingDie::castTheDieImpure);
140
+ }
141
+
142
+ // IO 値を作成(この時点では実行されない)
143
+ IO<Integer> dieCast = castTheDie();
144
+ System.out.println(dieCast); // IO(...) - まだ実行されていない
145
+
146
+ // 実際に実行
147
+ System.out.println(dieCast.unsafeRun()); // 4
148
+ ```
149
+
150
+ ### 8.5 IO の作成方法
151
+
152
+ | メソッド | 用途 | 例 |
153
+ |----------|------|-----|
154
+ | `IO.delay(expr)` | 副作用のある式をラップ | `IO.delay(() -> System.out.println("hello"))` |
155
+ | `IO.pure(value)` | 既存の値をラップ(副作用なし) | `IO.pure(42)` |
156
+ | `IO.unit()` | 何もしない IO | `IO.unit()` (= `IO.pure(null)`) |
157
+ | `IO.effect(runnable)` | 副作用のみを実行 | `IO.effect(() -> System.out.println("!"))` |
158
+
159
+ ```java
160
+ // IO.delay: 副作用を遅延実行
161
+ IO<Void> delayedPrint = IO.effect(() -> System.out.println("Hello"));
162
+ // println はまだ実行されていない
163
+
164
+ // IO.pure: 既存の値をラップ
165
+ IO<Integer> pureValue = IO.pure(42);
166
+ // 副作用なし、即座に 42 が確定
167
+ ```
168
+
169
+ ### 8.6 IO の合成
170
+
171
+ IO 値は `flatMap` や `map` で合成できます。
172
+
173
+ ```java
174
+ // サイコロを2回振って合計を返す
175
+ public static IO<Integer> castTheDieTwice() {
176
+ return castTheDie()
177
+ .flatMap(first -> castTheDie()
178
+ .map(second -> first + second));
179
+ }
180
+
181
+ // まだ実行されていない
182
+ IO<Integer> program = castTheDieTwice();
183
+
184
+ // 実行
185
+ int result = program.unsafeRun();
186
+ ```
187
+
188
+ ```plantuml
189
+ @startuml
190
+ !theme plain
191
+
192
+ rectangle "IO の合成" {
193
+ card "castTheDie()" as cast1
194
+ card "castTheDie()" as cast2
195
+ card "first + second" as combine
196
+
197
+ cast1 --> combine : flatMap
198
+ cast2 --> combine : map
199
+ }
200
+
201
+ note bottom
202
+ flatMap/map で
203
+ 順序付けて合成
204
+ end note
205
+
206
+ @enduml
207
+ ```
208
+
209
+ ### 8.7 ミーティングスケジューリングの例
210
+
211
+ **ソースファイル**: `app/java/src/main/java/ch08/SchedulingMeetings.java`
212
+
213
+ より実践的な例として、ミーティングのスケジューリングを見てみましょう。
214
+
215
+ #### データ型
216
+
217
+ ```java
218
+ public record MeetingTime(int startHour, int endHour) {
219
+ public int lengthHours() {
220
+ return endHour - startHour;
221
+ }
222
+ }
223
+ ```
224
+
225
+ #### 副作用のある API 呼び出しを IO でラップ
226
+
227
+ ```java
228
+ public static IO<List<MeetingTime>> calendarEntries(String name) {
229
+ return IO.delay(() -> simulateCalendarApi(name));
230
+ }
231
+
232
+ public static IO<Void> createMeeting(List<String> attendees, MeetingTime meeting) {
233
+ return IO.effect(() -> {
234
+ System.out.println("Creating meeting for " + attendees.mkString(", ") +
235
+ " at " + meeting.startHour() + ":00 - " + meeting.endHour() + ":00");
236
+ });
237
+ }
238
+ ```
239
+
240
+ #### 予定の取得
241
+
242
+ ```java
243
+ public static IO<List<MeetingTime>> scheduledMeetings(String person1, String person2) {
244
+ return calendarEntries(person1)
245
+ .flatMap(p1Entries -> calendarEntries(person2)
246
+ .map(p2Entries -> p1Entries.appendAll(p2Entries)));
247
+ }
248
+ ```
249
+
250
+ #### 空き時間の計算(純粋関数)
251
+
252
+ ```java
253
+ public static List<MeetingTime> possibleMeetings(
254
+ List<MeetingTime> existingMeetings,
255
+ int startHour,
256
+ int endHour,
257
+ int lengthHours) {
258
+
259
+ return List.range(startHour, endHour - lengthHours + 1)
260
+ .map(start -> new MeetingTime(start, start + lengthHours))
261
+ .filter(slot -> existingMeetings.forAll(
262
+ existing -> !meetingsOverlap(existing, slot)));
263
+ }
264
+ ```
265
+
266
+ ### 8.8 orElse によるエラーハンドリング
267
+
268
+ IO の `orElse` メソッドで、失敗時のフォールバックを指定できます。
269
+
270
+ ```java
271
+ IO<Integer> year = IO.delay(() -> 996);
272
+ IO<Integer> noYear = IO.delay(() -> { throw new RuntimeException("no year"); });
273
+
274
+ year.orElse(2020).unsafeRun(); // 996
275
+ noYear.orElse(2020).unsafeRun(); // 2020
276
+ ```
277
+
278
+ ```plantuml
279
+ @startuml
280
+ !theme plain
281
+
282
+ rectangle "orElse の動作" {
283
+ card "メインの IO" as main
284
+ card "フォールバック IO" as fallback
285
+ card "結果" as result
286
+
287
+ main --> result : 成功時
288
+ main --> fallback : 失敗時
289
+ fallback --> result
290
+ }
291
+
292
+ @enduml
293
+ ```
294
+
295
+ #### リトライ戦略
296
+
297
+ ```java
298
+ // API 呼び出しを3回までリトライ
299
+ calendarEntries("Alice")
300
+ .retry(3)
301
+ .orElse(List.empty()); // 全部失敗したら空リスト
302
+ ```
303
+
304
+ #### 汎用リトライ関数
305
+
306
+ ```java
307
+ public IO<A> retry(int maxRetries) {
308
+ IO<A> result = this;
309
+ for (int i = 0; i < maxRetries; i++) {
310
+ result = result.orElse(() -> this);
311
+ }
312
+ return result;
313
+ }
314
+
315
+ // 使用例
316
+ calendarEntries("Alice").retry(10);
317
+ ```
318
+
319
+ ### 8.9 sequence による IO のリスト処理
320
+
321
+ `List<IO<A>>` を `IO<List<A>>` に変換するには `sequence` を使います。
322
+
323
+ ```java
324
+ public static <A> IO<List<A>> sequence(List<IO<A>> ios) {
325
+ return ios.foldLeft(
326
+ IO.pure(List.empty()),
327
+ (acc, io) -> acc.flatMap(list -> io.map(list::append))
328
+ );
329
+ }
330
+
331
+ List<IO<Integer>> actions = List.of(IO.pure(1), IO.pure(2), IO.pure(3));
332
+ IO<List<Integer>> combined = IO.sequence(actions);
333
+
334
+ combined.unsafeRun(); // List(1, 2, 3)
335
+ ```
336
+
337
+ #### 複数人の予定を取得
338
+
339
+ ```java
340
+ public static IO<List<MeetingTime>> scheduledMeetings(List<String> attendees) {
341
+ return IO.traverse(attendees, SchedulingMeetings::calendarEntries)
342
+ .map(lists -> lists.flatMap(x -> x));
343
+ }
344
+ ```
345
+
346
+ ---
347
+
348
+ ## 第9章: ストリーム処理
349
+
350
+ ### 9.1 ストリームとは
351
+
352
+ **ストリーム**は、要素の(潜在的に無限の)シーケンスを表します。
353
+
354
+ ```plantuml
355
+ @startuml
356
+ !theme plain
357
+
358
+ rectangle "List vs Stream" {
359
+ rectangle "List" as list {
360
+ card "全要素がメモリに存在"
361
+ card "有限"
362
+ card "即座に評価"
363
+ }
364
+
365
+ rectangle "Stream" as stream {
366
+ card "必要な時に要素を生成"
367
+ card "無限も可能"
368
+ card "遅延評価"
369
+ }
370
+ }
371
+
372
+ @enduml
373
+ ```
374
+
375
+ ### 9.2 LazyStream の実装
376
+
377
+ **ソースファイル**: `app/java/src/main/java/ch09/LazyStream.java`
378
+
379
+ Java + Vavr での遅延評価ストリームの実装です:
380
+
381
+ ```java
382
+ public final class LazyStream<A> implements Iterable<A> {
383
+
384
+ private final Supplier<Option<Cons<A>>> headTail;
385
+
386
+ private record Cons<A>(A head, LazyStream<A> tail) {}
387
+
388
+ private LazyStream(Supplier<Option<Cons<A>>> headTail) {
389
+ this.headTail = headTail;
390
+ }
391
+
392
+ // 空のストリーム
393
+ public static <A> LazyStream<A> empty() {
394
+ return new LazyStream<>(Option::none);
395
+ }
396
+
397
+ // 単一要素のストリーム
398
+ public static <A> LazyStream<A> of(A value) {
399
+ return new LazyStream<>(() ->
400
+ Option.some(new Cons<>(value, empty())));
401
+ }
402
+
403
+ // 無限に値を繰り返すストリーム
404
+ public static <A> LazyStream<A> repeat(A value) {
405
+ return new LazyStream<>(() ->
406
+ Option.some(new Cons<>(value, repeat(value))));
407
+ }
408
+ }
409
+ ```
410
+
411
+ ### 9.3 純粋なストリーム
412
+
413
+ ```java
414
+ // 有限ストリーム
415
+ LazyStream<Integer> numbers = LazyStream.of(1, 2, 3);
416
+
417
+ // List に変換
418
+ numbers.toList(); // List(1, 2, 3)
419
+
420
+ // フィルタリング
421
+ LazyStream<Integer> oddNumbers = numbers.filter(x -> x % 2 != 0);
422
+ oddNumbers.toList(); // List(1, 3)
423
+ ```
424
+
425
+ ### 9.4 無限ストリーム
426
+
427
+ ```java
428
+ // repeat で無限に繰り返し
429
+ LazyStream<Integer> infinite123s = LazyStream.of(1, 2, 3).repeat();
430
+
431
+ // take で有限個を取得
432
+ infinite123s.take(8).toList(); // List(1, 2, 3, 1, 2, 3, 1, 2)
433
+ ```
434
+
435
+ ```plantuml
436
+ @startuml
437
+ !theme plain
438
+
439
+ rectangle "無限ストリーム" {
440
+ card "LazyStream.of(1, 2, 3).repeat()" as stream
441
+ card "1, 2, 3, 1, 2, 3, 1, 2, 3, ..." as infinite
442
+ card "take(8)" as take
443
+ card "[1, 2, 3, 1, 2, 3, 1, 2]" as result
444
+
445
+ stream --> infinite
446
+ infinite --> take
447
+ take --> result
448
+ }
449
+
450
+ note bottom
451
+ 無限のストリームから
452
+ 必要な分だけ取得
453
+ end note
454
+
455
+ @enduml
456
+ ```
457
+
458
+ ### 9.5 ストリームの主要操作
459
+
460
+ | 操作 | 説明 | 例 |
461
+ |------|------|-----|
462
+ | `take(n)` | 最初の n 要素を取得 | `stream.take(3)` |
463
+ | `filter(p)` | 条件を満たす要素のみ | `stream.filter(x -> x > 0)` |
464
+ | `map(f)` | 各要素を変換 | `stream.map(x -> x * 2)` |
465
+ | `append(s)` | 別のストリームを結合 | `stream1.append(stream2)` |
466
+ | `repeat()` | 無限に繰り返し | `stream.repeat()` |
467
+ | `sliding(n)` | スライディングウィンドウ | `stream.sliding(3)` |
468
+
469
+ ### 9.6 通貨交換レートの例
470
+
471
+ **ソースファイル**: `app/java/src/main/java/ch09/CurrencyExchange.java`
472
+
473
+ 為替レートを監視して、上昇トレンドを検出する例です。
474
+
475
+ #### トレンド判定(純粋関数)
476
+
477
+ ```java
478
+ public static boolean trending(List<BigDecimal> rates) {
479
+ if (rates.size() <= 1) {
480
+ return false;
481
+ }
482
+ return rates.zip(rates.drop(1))
483
+ .forAll(pair -> pair._2().compareTo(pair._1()) > 0);
484
+ }
485
+
486
+ trending(List.of(
487
+ BigDecimal.valueOf(0.81),
488
+ BigDecimal.valueOf(0.82),
489
+ BigDecimal.valueOf(0.83)
490
+ )); // true (上昇トレンド)
491
+
492
+ trending(List.of(
493
+ BigDecimal.valueOf(0.81),
494
+ BigDecimal.valueOf(0.84),
495
+ BigDecimal.valueOf(0.83)
496
+ )); // false
497
+ ```
498
+
499
+ #### レートのストリーム
500
+
501
+ ```java
502
+ public static LazyStream<IO<Option<BigDecimal>>> ratesStream(
503
+ Currency from,
504
+ Currency to) {
505
+ return LazyStream.continually(() -> rate(from, to));
506
+ }
507
+ ```
508
+
509
+ ### 9.7 スライディングウィンドウ
510
+
511
+ `sliding` で連続する要素をグループ化できます。
512
+
513
+ ```java
514
+ LazyStream<Integer> stream = LazyStream.of(1, 2, 3, 4, 5);
515
+
516
+ stream.sliding(3).toList().map(Queue::toList);
517
+ // List(List(1, 2, 3), List(2, 3, 4), List(3, 4, 5))
518
+ ```
519
+
520
+ ```plantuml
521
+ @startuml
522
+ !theme plain
523
+
524
+ rectangle "sliding(3) の動作" {
525
+ card "[1, 2, 3, 4, 5]" as input
526
+ card "[1, 2, 3]" as w1
527
+ card "[2, 3, 4]" as w2
528
+ card "[3, 4, 5]" as w3
529
+
530
+ input --> w1
531
+ input --> w2
532
+ input --> w3
533
+ }
534
+
535
+ @enduml
536
+ ```
537
+
538
+ #### トレンドを検出
539
+
540
+ ```java
541
+ public static Option<BigDecimal> findTrendInRates(
542
+ List<BigDecimal> rates,
543
+ int windowSize) {
544
+
545
+ LazyStream<Queue<BigDecimal>> windows = LazyStream.fromList(rates)
546
+ .sliding(windowSize);
547
+
548
+ for (Queue<BigDecimal> window : windows) {
549
+ List<BigDecimal> windowList = window.toList();
550
+ if (trending(windowList)) {
551
+ return Option.some(windowList.last());
552
+ }
553
+ }
554
+ return Option.none();
555
+ }
556
+ ```
557
+
558
+ ---
559
+
560
+ ## まとめ
561
+
562
+ ### Part IV で学んだこと
563
+
564
+ ```plantuml
565
+ @startuml
566
+ !theme plain
567
+
568
+ rectangle "Part IV: IO と副作用の管理" {
569
+ rectangle "第8章" as ch8 {
570
+ card "IO モナド"
571
+ card "IO.delay / IO.pure"
572
+ card "flatMap / map"
573
+ card "orElse"
574
+ card "retry"
575
+ card "sequence"
576
+ }
577
+
578
+ rectangle "第9章" as ch9 {
579
+ card "LazyStream"
580
+ card "無限ストリーム"
581
+ card "repeat / take"
582
+ card "sliding"
583
+ card "遅延評価"
584
+ }
585
+ }
586
+
587
+ ch8 --> ch9
588
+
589
+ @enduml
590
+ ```
591
+
592
+ ### IO と LazyStream の比較
593
+
594
+ | 特性 | IO<A> | LazyStream<A> |
595
+ |------|-------|---------------|
596
+ | 要素数 | 1つ | 0個以上(無限も可) |
597
+ | 実行 | `unsafeRun()` | `toList()` |
598
+ | 用途 | 単一の副作用 | 連続したデータ処理 |
599
+
600
+ ### キーポイント
601
+
602
+ 1. **IO モナド**: 副作用を「記述」として扱い、実行を遅延させる
603
+ 2. **IO.delay**: 副作用のある式を IO にラップ
604
+ 3. **orElse**: 失敗時のフォールバックを指定
605
+ 4. **sequence**: `List<IO<A>>` → `IO<List<A>>`
606
+ 5. **LazyStream**: 潜在的に無限のシーケンスを遅延評価で処理
607
+ 6. **sliding**: 連続する要素をグループ化してパターンを検出
608
+
609
+ ### Scala との比較
610
+
611
+ | 概念 | Scala (cats-effect/fs2) | Java + Vavr |
612
+ |------|-------------------------|-------------|
613
+ | IO 型 | `cats.effect.IO[A]` | `IO<A>` (独自実装) |
614
+ | 遅延実行 | `IO.delay(expr)` | `IO.delay(() -> expr)` |
615
+ | 即座の値 | `IO.pure(value)` | `IO.pure(value)` |
616
+ | 実行 | `unsafeRunSync()` | `unsafeRun()` |
617
+ | ストリーム | `fs2.Stream[F, A]` | `LazyStream<A>` (独自実装) |
618
+ | 無限繰り返し | `stream.repeat` | `stream.repeat()` |
619
+
620
+ ### 次のステップ
621
+
622
+ Part V では、以下のトピックを学ぶ予定です:
623
+
624
+ - 並行・並列処理
625
+ - 共有状態管理
626
+
627
+ ---
628
+
629
+ ## 演習問題
630
+
631
+ ### 問題 1: IO の基本
632
+
633
+ 以下の関数を実装してください。
634
+
635
+ ```java
636
+ public static IO<String> printAndReturn(String message) {
637
+ // "message" をコンソールに出力し、"message" を返す IO
638
+ }
639
+
640
+ // 期待される動作
641
+ // printAndReturn("Hello").unsafeRun() は
642
+ // "Hello" をコンソールに出力し、"Hello" を返す
643
+ ```
644
+
645
+ <details>
646
+ <summary>解答</summary>
647
+
648
+ ```java
649
+ public static IO<String> printAndReturn(String message) {
650
+ return IO.delay(() -> {
651
+ System.out.println(message);
652
+ return message;
653
+ });
654
+ }
655
+ ```
656
+
657
+ </details>
658
+
659
+ ### 問題 2: IO の合成
660
+
661
+ 以下の関数を実装してください。2つの IO を順番に実行し、結果を結合します。
662
+
663
+ ```java
664
+ public static <A, B, C> IO<C> combineIO(
665
+ IO<A> io1,
666
+ IO<B> io2,
667
+ BiFunction<A, B, C> f) {
668
+ // ???
669
+ }
670
+
671
+ // 期待される動作
672
+ IO<Integer> result = combineIO(IO.pure(1), IO.pure(2), Integer::sum);
673
+ result.unsafeRun(); // 3
674
+ ```
675
+
676
+ <details>
677
+ <summary>解答</summary>
678
+
679
+ ```java
680
+ public static <A, B, C> IO<C> combineIO(
681
+ IO<A> io1,
682
+ IO<B> io2,
683
+ BiFunction<A, B, C> f) {
684
+ return io1.flatMap(a -> io2.map(b -> f.apply(a, b)));
685
+ }
686
+ ```
687
+
688
+ </details>
689
+
690
+ ### 問題 3: リトライ
691
+
692
+ 以下の関数を実装してください。指定回数リトライし、全部失敗したらデフォルト値を返します。
693
+
694
+ ```java
695
+ public IO<A> retryWithDefault(int maxRetries, A defaultValue) {
696
+ // ???
697
+ }
698
+ ```
699
+
700
+ <details>
701
+ <summary>解答</summary>
702
+
703
+ ```java
704
+ public IO<A> retryWithDefault(int maxRetries, A defaultValue) {
705
+ return retry(maxRetries).orElse(defaultValue);
706
+ }
707
+ ```
708
+
709
+ </details>
710
+
711
+ ### 問題 4: ストリーム操作
712
+
713
+ 以下のストリームを作成してください。
714
+
715
+ ```java
716
+ // 1. 1から10までの偶数のストリーム
717
+ LazyStream<Integer> evens = ???
718
+
719
+ // 2. 無限に交互に true/false を返すストリーム
720
+ LazyStream<Boolean> alternating = ???
721
+
722
+ // 3. 最初の5つの要素の合計を計算
723
+ int sum = LazyStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).take(5).???
724
+ ```
725
+
726
+ <details>
727
+ <summary>解答</summary>
728
+
729
+ ```java
730
+ // 1. 1から10までの偶数
731
+ LazyStream<Integer> evens = LazyStream.range(1, 11).filter(x -> x % 2 == 0);
732
+ // または
733
+ LazyStream<Integer> evens = LazyStream.of(2, 4, 6, 8, 10);
734
+
735
+ // 2. 無限に交互に true/false
736
+ LazyStream<Boolean> alternating = LazyStream.of(true, false).repeat();
737
+
738
+ // 3. 最初の5つの要素の合計
739
+ int sum = LazyStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
740
+ .take(5)
741
+ .foldLeft(0, Integer::sum); // 15
742
+ ```
743
+
744
+ </details>
745
+
746
+ ### 問題 5: トレンド検出
747
+
748
+ 以下の関数を実装してください。直近3つの値が全て同じかどうかを判定します。
749
+
750
+ ```java
751
+ public static boolean isStable(List<BigDecimal> values) {
752
+ // ???
753
+ }
754
+
755
+ // 期待される動作
756
+ assert isStable(List.of(bd(5), bd(5), bd(5))) == true;
757
+ assert isStable(List.of(bd(5), bd(5), bd(6))) == false;
758
+ assert isStable(List.of(bd(5), bd(6), bd(5))) == false;
759
+ assert isStable(List.of(bd(5))) == false; // 3つ未満は false
760
+ ```
761
+
762
+ <details>
763
+ <summary>解答</summary>
764
+
765
+ ```java
766
+ public static boolean isStable(List<BigDecimal> values) {
767
+ return values.size() >= 3 && values.distinct().size() == 1;
768
+ }
769
+ ```
770
+
771
+ </details>