@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,876 @@
1
+ # Part IV: IO と副作用の管理
2
+
3
+ 本章では、関数型プログラミングにおける副作用の扱い方を学びます。Haskell では 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
+ Haskell では IO 型で
39
+ 副作用を明示的に管理
40
+ end note
41
+
42
+ @enduml
43
+ ```
44
+
45
+ ### 8.2 IO モナドとは
46
+
47
+ Haskell の **IO モナド**は「副作用を持つ計算」を表す型です。
48
+
49
+ - `IO a` は「実行すると `a` 型の値を返す副作用のある計算」
50
+ - IO 値は `do` 記法で合成できる
51
+ - Haskell のプログラムは `main :: IO ()` から始まる
52
+
53
+ ```plantuml
54
+ @startuml
55
+ !theme plain
56
+
57
+ rectangle "IO の仕組み" {
58
+ card "IO アクション定義" as create
59
+ card "IO a 値" as io
60
+ card "main 関数" as run
61
+ card "副作用が実行される" as effect
62
+
63
+ create --> io : 計算を記述
64
+ io --> run : プログラムとして
65
+ run --> effect : 実際に実行
66
+ }
67
+
68
+ note bottom of io
69
+ IO 型は副作用を
70
+ 型システムで追跡
71
+ end note
72
+
73
+ @enduml
74
+ ```
75
+
76
+ ### 8.3 サイコロを振る例
77
+
78
+ **ソースファイル**: `app/haskell/src/Ch08/IOMonad.hs`
79
+
80
+ #### 乱数生成(IO を使用)
81
+
82
+ ```haskell
83
+ import System.Random (randomRIO)
84
+
85
+ -- | サイコロを振る(副作用あり)
86
+ castTheDie :: IO Int
87
+ castTheDie = randomRIO (1, 6)
88
+ ```
89
+
90
+ Scala との違い:
91
+ - Scala: `IO.delay(random.nextInt(6) + 1)` で副作用をラップ
92
+ - Haskell: `randomRIO` 自体が `IO Int` を返す
93
+
94
+ #### サイコロを2回振る
95
+
96
+ ```haskell
97
+ -- | サイコロを2回振って合計を返す
98
+ castTheDieTwice :: IO Int
99
+ castTheDieTwice = do
100
+ first <- castTheDie
101
+ second <- castTheDie
102
+ return (first + second)
103
+ ```
104
+
105
+ Scala での同等のコード:
106
+ ```scala
107
+ def castTheDieTwice(): IO[Int] = {
108
+ for {
109
+ first <- castTheDie()
110
+ second <- castTheDie()
111
+ } yield first + second
112
+ }
113
+ ```
114
+
115
+ ### 8.4 do 記法
116
+
117
+ Haskell の `do` 記法は、Scala の `for` 内包表記に相当します。
118
+
119
+ ```haskell
120
+ -- do 記法
121
+ castTheDieTwice :: IO Int
122
+ castTheDieTwice = do
123
+ first <- castTheDie
124
+ second <- castTheDie
125
+ return (first + second)
126
+
127
+ -- 脱糖後(>>=を使用)
128
+ castTheDieTwice :: IO Int
129
+ castTheDieTwice =
130
+ castTheDie >>= \first ->
131
+ castTheDie >>= \second ->
132
+ return (first + second)
133
+ ```
134
+
135
+ | Haskell | Scala | 説明 |
136
+ |---------|-------|------|
137
+ | `do` | `for` | モナド内包表記 |
138
+ | `<-` | `<-` | 値の取り出し |
139
+ | `return` | `yield` または `IO.pure` | 値をモナドに包む |
140
+ | `>>=` | `flatMap` | モナドの連鎖 |
141
+
142
+ ### 8.5 複数回のサイコロ
143
+
144
+ ```haskell
145
+ import Control.Monad (replicateM)
146
+
147
+ -- | サイコロをn回振って結果をリストで返す
148
+ castTheDieN :: Int -> IO [Int]
149
+ castTheDieN n = replicateM n castTheDie
150
+ ```
151
+
152
+ `replicateM` は Scala の `sequence` + `List.fill` に相当:
153
+ ```scala
154
+ // Scala
155
+ def castTheDieN(n: Int): IO[List[Int]] =
156
+ List.fill(n)(castTheDie()).sequence
157
+ ```
158
+
159
+ ### 8.6 ミーティングスケジューリングの例
160
+
161
+ #### データ型の定義
162
+
163
+ ```haskell
164
+ -- | ミーティング時間を表すデータ型
165
+ data MeetingTime = MeetingTime
166
+ { mtStartHour :: Int
167
+ , mtEndHour :: Int
168
+ } deriving (Show, Eq)
169
+ ```
170
+
171
+ #### 重複判定(純粋関数)
172
+
173
+ ```haskell
174
+ -- | 2つのミーティングが重なっているかを判定
175
+ meetingsOverlap :: MeetingTime -> MeetingTime -> Bool
176
+ meetingsOverlap m1 m2 =
177
+ mtStartHour m1 < mtEndHour m2 && mtEndHour m1 > mtStartHour m2
178
+ ```
179
+
180
+ ```plantuml
181
+ @startuml
182
+ !theme plain
183
+
184
+ rectangle "ミーティングの重複判定" {
185
+ card "[9:00-10:00]" as m1
186
+ card "[10:00-11:00]" as m2
187
+ card "[9:00-11:00]" as m3
188
+
189
+ m1 -[hidden]-> m2
190
+ m2 -[hidden]-> m3
191
+ }
192
+
193
+ note "m1 と m2: 重複なし(隣接)" as n1
194
+ note "m1 と m3: 重複あり" as n2
195
+ note "m2 と m3: 重複あり" as n3
196
+
197
+ @enduml
198
+ ```
199
+
200
+ #### 空き時間の計算
201
+
202
+ ```haskell
203
+ -- | 可能なミーティング時間を計算(純粋関数)
204
+ possibleMeetings :: [MeetingTime] -> Int -> Int -> Int -> [MeetingTime]
205
+ possibleMeetings existingMeetings startHour endHour lengthHours =
206
+ let slots = [MeetingTime s (s + lengthHours) | s <- [startHour .. endHour - lengthHours]]
207
+ in filter (\slot -> all (not . meetingsOverlap slot) existingMeetings) slots
208
+ ```
209
+
210
+ Haskell のリスト内包表記 `[... | ...]` は、Scala の `for` 内包表記に似ています:
211
+ ```scala
212
+ // Scala
213
+ val slots = for {
214
+ s <- startHour to (endHour - lengthHours)
215
+ } yield MeetingTime(s, s + lengthHours)
216
+ ```
217
+
218
+ ### 8.7 IO の合成
219
+
220
+ ```haskell
221
+ -- | 2つの IO を合成
222
+ combineIO :: IO a -> IO b -> (a -> b -> c) -> IO c
223
+ combineIO io1 io2 f = do
224
+ a <- io1
225
+ b <- io2
226
+ return (f a b)
227
+ ```
228
+
229
+ 使用例:
230
+ ```haskell
231
+ ghci> result <- combineIO (return 1) (return 2) (+)
232
+ ghci> print result
233
+ 3
234
+ ```
235
+
236
+ #### IO のリストを順番に実行
237
+
238
+ ```haskell
239
+ -- | IO のリストを順番に実行
240
+ sequenceIO :: [IO a] -> IO [a]
241
+ sequenceIO [] = return []
242
+ sequenceIO (x:xs) = do
243
+ a <- x
244
+ as <- sequenceIO xs
245
+ return (a : as)
246
+ ```
247
+
248
+ 標準ライブラリの `sequence` と同じ機能です。
249
+
250
+ ### 8.8 エラーハンドリング
251
+
252
+ ```haskell
253
+ import Control.Exception (try, SomeException)
254
+
255
+ -- | 例外をキャッチして Either に変換
256
+ catchIO :: IO a -> IO (Either String a)
257
+ catchIO action = do
258
+ result <- try action :: IO (Either SomeException a)
259
+ return $ case result of
260
+ Right a -> Right a
261
+ Left e -> Left (show e)
262
+ ```
263
+
264
+ #### リトライ機能
265
+
266
+ ```haskell
267
+ -- | IO アクションをリトライ
268
+ retryIO :: Int -> IO a -> IO (Maybe a)
269
+ retryIO 0 _ = return Nothing
270
+ retryIO n action = do
271
+ result <- try action :: IO (Either SomeException a)
272
+ case result of
273
+ Right a -> return (Just a)
274
+ Left _ -> retryIO (n - 1) action
275
+
276
+ -- | リトライしてデフォルト値を返す
277
+ retryWithDefault :: Int -> a -> IO a -> IO a
278
+ retryWithDefault maxRetries defaultVal action = do
279
+ result <- retryIO maxRetries action
280
+ return $ maybe defaultVal id result
281
+ ```
282
+
283
+ ### 8.9 純粋関数と IO の分離
284
+
285
+ ```haskell
286
+ -- | 入力をパースして検証(純粋関数)
287
+ parseAndValidate :: String -> Either String Int
288
+ parseAndValidate input =
289
+ case reads input of
290
+ [(n, "")] | n > 0 -> Right n
291
+ | otherwise -> Left "Number must be positive"
292
+ _ -> Left "Invalid number"
293
+
294
+ -- | 入力を処理(IO と純粋関数の分離)
295
+ processInput :: IO ()
296
+ processInput = do
297
+ putStr "Enter a positive number: "
298
+ input <- getLine
299
+ case parseAndValidate input of
300
+ Right n -> putStrLn $ "Valid: " ++ show n
301
+ Left err -> putStrLn $ "Error: " ++ err
302
+ ```
303
+
304
+ ```plantuml
305
+ @startuml
306
+ !theme plain
307
+
308
+ rectangle "純粋関数と IO の分離" {
309
+ card "getLine" as input
310
+ card "parseAndValidate\n(純粋関数)" as parse
311
+ card "putStrLn" as output
312
+
313
+ input --> parse : String
314
+ parse --> output : Either String Int
315
+ }
316
+
317
+ note bottom
318
+ IO は境界部分のみ
319
+ ロジックは純粋関数で
320
+ end note
321
+
322
+ @enduml
323
+ ```
324
+
325
+ ---
326
+
327
+ ## 第9章: ストリーム処理
328
+
329
+ ### 9.1 遅延リストとは
330
+
331
+ Haskell のリストは**遅延評価**されます。これにより、無限リストを扱うことができます。
332
+
333
+ ```plantuml
334
+ @startuml
335
+ !theme plain
336
+
337
+ rectangle "List (正格評価) vs Haskell List (遅延評価)" {
338
+ rectangle "Scala List" as list {
339
+ card "全要素がメモリに存在"
340
+ card "有限"
341
+ card "即座に評価"
342
+ }
343
+
344
+ rectangle "Haskell List" as stream {
345
+ card "必要な時に要素を生成"
346
+ card "無限も可能"
347
+ card "遅延評価"
348
+ }
349
+ }
350
+
351
+ @enduml
352
+ ```
353
+
354
+ Scala では `fs2.Stream` を使いますが、Haskell では標準のリストが遅延評価のため、そのまま無限ストリームとして機能します。
355
+
356
+ ### 9.2 無限ストリームの基本
357
+
358
+ **ソースファイル**: `app/haskell/src/Ch09/StreamProcessing.hs`
359
+
360
+ ```haskell
361
+ -- | 自然数の無限ストリーム
362
+ naturals :: [Integer]
363
+ naturals = [1..]
364
+
365
+ -- | 偶数の無限ストリーム
366
+ evens :: [Integer]
367
+ evens = [2,4..]
368
+
369
+ -- | 奇数の無限ストリーム
370
+ odds :: [Integer]
371
+ odds = [1,3..]
372
+ ```
373
+
374
+ ```haskell
375
+ ghci> take 10 naturals
376
+ [1,2,3,4,5,6,7,8,9,10]
377
+
378
+ ghci> take 5 evens
379
+ [2,4,6,8,10]
380
+ ```
381
+
382
+ ### 9.3 フィボナッチ数列
383
+
384
+ 遅延評価を使った自己参照的な定義:
385
+
386
+ ```haskell
387
+ -- | フィボナッチ数列の無限ストリーム
388
+ fibs :: [Integer]
389
+ fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
390
+ ```
391
+
392
+ ```plantuml
393
+ @startuml
394
+ !theme plain
395
+
396
+ rectangle "フィボナッチ数列の生成" {
397
+ card "fibs = [0, 1, 1, 2, 3, 5, 8, ...]" as f1
398
+ card "tail fibs = [1, 1, 2, 3, 5, 8, ...]" as f2
399
+ card "zipWith (+)" as zip
400
+ card "[1, 2, 3, 5, 8, 13, ...]" as result
401
+
402
+ f1 --> zip
403
+ f2 --> zip
404
+ zip --> result
405
+ }
406
+
407
+ note bottom
408
+ 自己参照的な定義
409
+ 遅延評価で可能に
410
+ end note
411
+
412
+ @enduml
413
+ ```
414
+
415
+ ```haskell
416
+ ghci> take 10 fibs
417
+ [0,1,1,2,3,5,8,13,21,34]
418
+ ```
419
+
420
+ ### 9.4 素数のストリーム(エラトステネスのふるい)
421
+
422
+ ```haskell
423
+ -- | 素数の無限ストリーム
424
+ primes :: [Integer]
425
+ primes = sieve [2..]
426
+ where
427
+ sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0]
428
+ sieve [] = []
429
+ ```
430
+
431
+ ```haskell
432
+ ghci> take 10 primes
433
+ [2,3,5,7,11,13,17,19,23,29]
434
+ ```
435
+
436
+ ### 9.5 ストリーム生成関数
437
+
438
+ ```haskell
439
+ -- | 同じ値を無限に繰り返す(Scala の Stream.repeat に相当)
440
+ repeatVal :: a -> [a]
441
+ repeatVal x = x : repeatVal x
442
+
443
+ -- | リストを無限に繰り返す(Scala の Stream(...).repeat に相当)
444
+ cycleList :: [a] -> [a]
445
+ cycleList xs = xs ++ cycleList xs
446
+
447
+ -- | 関数を繰り返し適用して無限リストを生成
448
+ iterate' :: (a -> a) -> a -> [a]
449
+ iterate' f x = x : iterate' f (f x)
450
+ ```
451
+
452
+ ```haskell
453
+ ghci> take 5 (repeatVal 1)
454
+ [1,1,1,1,1]
455
+
456
+ ghci> take 7 (cycleList [1,2,3])
457
+ [1,2,3,1,2,3,1]
458
+
459
+ ghci> take 5 (iterate' (*2) 1)
460
+ [1,2,4,8,16]
461
+ ```
462
+
463
+ ### 9.6 unfold: 汎用的なストリーム生成
464
+
465
+ ```haskell
466
+ -- | unfold: 種から無限リストを生成
467
+ unfold :: (b -> Maybe (a, b)) -> b -> [a]
468
+ unfold f seed = case f seed of
469
+ Nothing -> []
470
+ Just (a, b') -> a : unfold f b'
471
+ ```
472
+
473
+ Scala の `Stream.unfold` に相当:
474
+ ```scala
475
+ // Scala
476
+ Stream.unfold(0)(n => Some((n, n + 1)))
477
+ ```
478
+
479
+ ```haskell
480
+ -- Haskell
481
+ ghci> take 5 (unfold (\n -> Just (n, n+1)) 0)
482
+ [0,1,2,3,4]
483
+ ```
484
+
485
+ ### 9.7 ストリーム操作
486
+
487
+ ```haskell
488
+ -- | 条件を満たす間、要素を取得(Scala の takeWhile)
489
+ takeWhile' :: (a -> Bool) -> [a] -> [a]
490
+ takeWhile' _ [] = []
491
+ takeWhile' p (x:xs)
492
+ | p x = x : takeWhile' p xs
493
+ | otherwise = []
494
+
495
+ -- | 条件を満たす間、要素をスキップ(Scala の dropWhile)
496
+ dropWhile' :: (a -> Bool) -> [a] -> [a]
497
+ dropWhile' _ [] = []
498
+ dropWhile' p xs@(x:xs')
499
+ | p x = dropWhile' p xs'
500
+ | otherwise = xs
501
+ ```
502
+
503
+ ```haskell
504
+ ghci> takeWhile' (<5) [1,2,3,4,5,6]
505
+ [1,2,3,4]
506
+
507
+ ghci> dropWhile' (<5) [1,2,3,4,5,6]
508
+ [5,6]
509
+ ```
510
+
511
+ ### 9.8 スライディングウィンドウ
512
+
513
+ ```haskell
514
+ -- | スライディングウィンドウ(Scala の sliding に相当)
515
+ sliding :: Int -> [a] -> [[a]]
516
+ sliding n xs
517
+ | length window < n = []
518
+ | otherwise = window : sliding n (tail xs)
519
+ where
520
+ window = take n xs
521
+ ```
522
+
523
+ ```plantuml
524
+ @startuml
525
+ !theme plain
526
+
527
+ rectangle "sliding 3 [1,2,3,4,5] の動作" {
528
+ card "[1, 2, 3, 4, 5]" as input
529
+ card "[1, 2, 3]" as w1
530
+ card "[2, 3, 4]" as w2
531
+ card "[3, 4, 5]" as w3
532
+
533
+ input --> w1
534
+ input --> w2
535
+ input --> w3
536
+ }
537
+
538
+ @enduml
539
+ ```
540
+
541
+ ```haskell
542
+ ghci> sliding 3 [1,2,3,4,5]
543
+ [[1,2,3],[2,3,4],[3,4,5]]
544
+ ```
545
+
546
+ ### 9.9 チャンク分割
547
+
548
+ ```haskell
549
+ -- | 固定サイズのチャンクに分割
550
+ chunksOf :: Int -> [a] -> [[a]]
551
+ chunksOf _ [] = []
552
+ chunksOf n xs = take n xs : chunksOf n (drop n xs)
553
+ ```
554
+
555
+ ```haskell
556
+ ghci> chunksOf 3 [1,2,3,4,5,6,7,8]
557
+ [[1,2,3],[4,5,6],[7,8]]
558
+ ```
559
+
560
+ ### 9.10 トレンド検出
561
+
562
+ 通貨交換レートの監視に使用する関数:
563
+
564
+ ```haskell
565
+ -- | 上昇トレンドかどうかを判定
566
+ trending :: Ord a => [a] -> Bool
567
+ trending xs =
568
+ length xs > 1 &&
569
+ all (uncurry (<)) (zip xs (tail xs))
570
+
571
+ -- | 安定(全て同じ値)かどうかを判定
572
+ isStable :: Eq a => [a] -> Bool
573
+ isStable xs =
574
+ length xs >= 3 &&
575
+ all (== head xs) xs
576
+ ```
577
+
578
+ ```haskell
579
+ ghci> trending [0.81, 0.82, 0.83]
580
+ True
581
+
582
+ ghci> trending [0.81, 0.84, 0.83]
583
+ False
584
+
585
+ ghci> isStable [5, 5, 5]
586
+ True
587
+ ```
588
+
589
+ ### 9.11 通貨交換レートの例
590
+
591
+ ```haskell
592
+ type ExchangeRate = Double
593
+
594
+ -- | 為替レートをシミュレート(無限ストリーム)
595
+ simulateRates :: ExchangeRate -> [ExchangeRate]
596
+ simulateRates initial = iterate' vary initial
597
+ where
598
+ vary rate = rate + sin (rate * 100) * 0.01
599
+
600
+ -- | 上昇トレンドを検出するまでレートを監視
601
+ findUptrend :: Int -> [ExchangeRate] -> Maybe [ExchangeRate]
602
+ findUptrend = findTrend
603
+
604
+ -- | ストリームから上昇トレンドを検出
605
+ findTrend :: Ord a => Int -> [a] -> Maybe [a]
606
+ findTrend windowSize xs =
607
+ case filter trending (sliding windowSize xs) of
608
+ [] -> Nothing
609
+ (w:_) -> Just w
610
+ ```
611
+
612
+ #### トレンドを検出して交換
613
+
614
+ ```haskell
615
+ -- | 上昇トレンドを検出したら交換
616
+ exchangeIfTrending :: Double -> Int -> [ExchangeRate] -> Maybe Double
617
+ exchangeIfTrending amount windowSize rates =
618
+ case findUptrend windowSize rates of
619
+ Just trend -> Just $ amount * last trend
620
+ Nothing -> Nothing
621
+ ```
622
+
623
+ ```haskell
624
+ ghci> exchangeIfTrending 100 3 [0.80, 0.81, 0.82, 0.83, 0.80]
625
+ Just 82.0
626
+ ```
627
+
628
+ ### 9.12 ストリーム合成
629
+
630
+ ```haskell
631
+ -- | インデックス付きストリーム(Scala の zipWithIndex)
632
+ zipWithIndex :: [a] -> [(Int, a)]
633
+ zipWithIndex = zip [0..]
634
+
635
+ -- | 2つのストリームを交互に合成
636
+ interleave :: [a] -> [a] -> [a]
637
+ interleave [] ys = ys
638
+ interleave xs [] = xs
639
+ interleave (x:xs) (y:ys) = x : y : interleave xs ys
640
+
641
+ -- | 2つのソート済みストリームをマージ
642
+ merge :: Ord a => [a] -> [a] -> [a]
643
+ merge [] ys = ys
644
+ merge xs [] = xs
645
+ merge (x:xs) (y:ys)
646
+ | x <= y = x : merge xs (y:ys)
647
+ | otherwise = y : merge (x:xs) ys
648
+ ```
649
+
650
+ ```haskell
651
+ ghci> take 3 (zipWithIndex ['a', 'b', 'c'])
652
+ [(0,'a'),(1,'b'),(2,'c')]
653
+
654
+ ghci> take 6 (interleave [1,3,5] [2,4,6])
655
+ [1,2,3,4,5,6]
656
+
657
+ ghci> take 10 (merge [1,3,5,7,9] [2,4,6,8,10])
658
+ [1,2,3,4,5,6,7,8,9,10]
659
+ ```
660
+
661
+ ---
662
+
663
+ ## まとめ
664
+
665
+ ### Part IV で学んだこと
666
+
667
+ ```plantuml
668
+ @startuml
669
+ !theme plain
670
+
671
+ rectangle "Part IV: IO と副作用の管理" {
672
+ rectangle "第8章" as ch8 {
673
+ card "IO モナド"
674
+ card "do 記法"
675
+ card "replicateM"
676
+ card "try / catch"
677
+ card "retryIO"
678
+ card "純粋関数との分離"
679
+ }
680
+
681
+ rectangle "第9章" as ch9 {
682
+ card "遅延リスト"
683
+ card "無限ストリーム"
684
+ card "iterate / unfold"
685
+ card "sliding"
686
+ card "zipWithIndex"
687
+ card "interleave / merge"
688
+ }
689
+ }
690
+
691
+ ch8 --> ch9
692
+
693
+ @enduml
694
+ ```
695
+
696
+ ### Scala と Haskell の比較
697
+
698
+ | 概念 | Scala (cats-effect/fs2) | Haskell |
699
+ |------|-------------------------|---------|
700
+ | 副作用の型 | `IO[A]` | `IO a` |
701
+ | 遅延実行 | `IO.delay(expr)` | 関数が `IO` を返す |
702
+ | 値のラップ | `IO.pure(value)` | `return value` |
703
+ | モナド合成 | `for` 内包表記 | `do` 記法 |
704
+ | flatMap | `flatMap` | `>>=` |
705
+ | ストリーム | `fs2.Stream[IO, A]` | 標準の `[a]`(遅延評価) |
706
+ | 無限繰り返し | `Stream(...).repeat` | `repeat` / `cycle` |
707
+ | スライディング | `stream.sliding(n)` | `sliding n xs` |
708
+ | リストの sequence | `list.sequence` | `sequence` |
709
+
710
+ ### キーポイント
711
+
712
+ 1. **IO モナド**: Haskell では副作用を持つ計算は必ず `IO` 型を返す
713
+ 2. **do 記法**: Scala の `for` 内包表記に相当、モナドを順序付けて合成
714
+ 3. **遅延評価**: Haskell のリストはデフォルトで遅延評価、無限リストが自然に扱える
715
+ 4. **純粋関数との分離**: ロジックは純粋関数で、IO は境界部分のみ
716
+ 5. **ストリーム生成**: `iterate`、`unfold` で無限ストリームを生成
717
+ 6. **パターン検出**: `sliding` でウィンドウを作り、`trending` でパターンを検出
718
+
719
+ ### 次のステップ
720
+
721
+ Part V では、以下のトピックを学びます:
722
+
723
+ - 並行・並列処理
724
+ - Concurrent Haskell
725
+ - STM(Software Transactional Memory)
726
+ - async ライブラリ
727
+
728
+ ---
729
+
730
+ ## 演習問題
731
+
732
+ ### 問題 1: IO の基本
733
+
734
+ 以下の関数を実装してください。
735
+
736
+ ```haskell
737
+ -- メッセージを出力して返す
738
+ printAndReturn :: String -> IO String
739
+ printAndReturn message = ???
740
+
741
+ -- 期待される動作
742
+ -- > result <- printAndReturn "Hello"
743
+ -- Hello
744
+ -- > result
745
+ -- "Hello"
746
+ ```
747
+
748
+ <details>
749
+ <summary>解答</summary>
750
+
751
+ ```haskell
752
+ printAndReturn :: String -> IO String
753
+ printAndReturn message = do
754
+ putStrLn message
755
+ return message
756
+ ```
757
+
758
+ </details>
759
+
760
+ ### 問題 2: IO の合成
761
+
762
+ 以下の関数を実装してください。2つの IO を順番に実行し、結果を結合します。
763
+
764
+ ```haskell
765
+ combineIO :: IO a -> IO b -> (a -> b -> c) -> IO c
766
+ combineIO io1 io2 f = ???
767
+
768
+ -- 期待される動作
769
+ -- > result <- combineIO (return 1) (return 2) (+)
770
+ -- > result
771
+ -- 3
772
+ ```
773
+
774
+ <details>
775
+ <summary>解答</summary>
776
+
777
+ ```haskell
778
+ combineIO :: IO a -> IO b -> (a -> b -> c) -> IO c
779
+ combineIO io1 io2 f = do
780
+ a <- io1
781
+ b <- io2
782
+ return (f a b)
783
+ ```
784
+
785
+ </details>
786
+
787
+ ### 問題 3: リトライ
788
+
789
+ 以下の関数を実装してください。指定回数リトライし、全部失敗したらデフォルト値を返します。
790
+
791
+ ```haskell
792
+ retryWithDefault :: Int -> a -> IO a -> IO a
793
+ retryWithDefault maxRetries defaultVal action = ???
794
+ ```
795
+
796
+ <details>
797
+ <summary>解答</summary>
798
+
799
+ ```haskell
800
+ import Control.Exception (try, SomeException)
801
+
802
+ retryWithDefault :: Int -> a -> IO a -> IO a
803
+ retryWithDefault 0 defaultVal _ = return defaultVal
804
+ retryWithDefault n defaultVal action = do
805
+ result <- try action :: IO (Either SomeException a)
806
+ case result of
807
+ Right a -> return a
808
+ Left _ -> retryWithDefault (n - 1) defaultVal action
809
+ ```
810
+
811
+ </details>
812
+
813
+ ### 問題 4: ストリーム操作
814
+
815
+ 以下のストリームを作成してください。
816
+
817
+ ```haskell
818
+ -- 1. 1から10までの偶数のリスト
819
+ evens :: [Int]
820
+ evens = ???
821
+
822
+ -- 2. 無限に交互に True/False を返すリスト
823
+ alternating :: [Bool]
824
+ alternating = ???
825
+
826
+ -- 3. 最初の5つの要素の合計を計算
827
+ sumFirst5 :: [Int] -> Int
828
+ sumFirst5 xs = ???
829
+ ```
830
+
831
+ <details>
832
+ <summary>解答</summary>
833
+
834
+ ```haskell
835
+ -- 1. 1から10までの偶数
836
+ evens :: [Int]
837
+ evens = [2, 4, 6, 8, 10]
838
+ -- または
839
+ evens = filter even [1..10]
840
+
841
+ -- 2. 無限に交互に True/False
842
+ alternating :: [Bool]
843
+ alternating = cycle [True, False]
844
+
845
+ -- 3. 最初の5つの要素の合計
846
+ sumFirst5 :: [Int] -> Int
847
+ sumFirst5 xs = sum (take 5 xs)
848
+ ```
849
+
850
+ </details>
851
+
852
+ ### 問題 5: トレンド検出
853
+
854
+ 以下の関数を実装してください。直近の値が減少傾向かどうかを判定します。
855
+
856
+ ```haskell
857
+ declining :: Ord a => [a] -> Bool
858
+ declining xs = ???
859
+
860
+ -- 期待される動作
861
+ -- declining [0.83, 0.82, 0.81] -- True (減少トレンド)
862
+ -- declining [0.81, 0.82, 0.83] -- False
863
+ -- declining [0.81] -- False (1要素では判定不可)
864
+ ```
865
+
866
+ <details>
867
+ <summary>解答</summary>
868
+
869
+ ```haskell
870
+ declining :: Ord a => [a] -> Bool
871
+ declining xs =
872
+ length xs > 1 &&
873
+ all (uncurry (>)) (zip xs (tail xs))
874
+ ```
875
+
876
+ </details>