@k2works/claude-code-booster 2.7.1 → 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 (527) 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 -103
  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/review/index.md +5 -0
  522. package/lib/assets/docs/strategy/index.md +15 -0
  523. package/lib/assets/docs/template/index.md +9 -5
  524. package/lib/assets/mkdocs.yml +33 -19
  525. package/package.json +1 -1
  526. package/lib/assets/docs/analysis/index.md +0 -8
  527. /package/lib/assets/docs/{analysis → strategy}/slide/.gitkeep +0 -0
@@ -0,0 +1,323 @@
1
+ # 第20章 パターンの相互作用 - 複合パターンの活用
2
+
3
+ ## 概要
4
+
5
+ この章では、複数の関数型デザインパターンを組み合わせて、複雑な問題を解決する方法を学びます。ECサイトのショッピングカートシステムを例に、Strategy、Decorator、Command、Composite、Visitor パターンの統合を示します。
6
+
7
+ ## 学習目標
8
+
9
+ - 複数パターンの効果的な組み合わせ方
10
+ - パターン間の協調動作の設計
11
+ - 実用的なシステムでのパターン適用
12
+ - 関数型での柔軟なアーキテクチャ構築
13
+
14
+ ## 商品と価格設定
15
+
16
+ ### 商品の定義
17
+
18
+ ```haskell
19
+ -- | 商品
20
+ data Product = Product
21
+ { productId :: String
22
+ , productName :: String
23
+ , productBasePrice :: Double
24
+ , productCategory :: String
25
+ } deriving (Show, Eq)
26
+
27
+ -- | 商品の作成
28
+ makeProduct :: String -> String -> Double -> String -> Product
29
+ makeProduct = Product
30
+ ```
31
+
32
+ ### 価格設定戦略 (Strategy パターン)
33
+
34
+ ```haskell
35
+ -- | 価格設定戦略
36
+ newtype PricingStrategy = PricingStrategy
37
+ { applyPricing :: Product -> Int -> Double
38
+ }
39
+
40
+ -- | 通常価格
41
+ regularPricing :: PricingStrategy
42
+ regularPricing = PricingStrategy $ \prod qty ->
43
+ productBasePrice prod * fromIntegral qty
44
+
45
+ -- | 割引価格
46
+ discountPricing :: Double -> PricingStrategy
47
+ discountPricing percent = PricingStrategy $ \prod qty ->
48
+ productBasePrice prod * fromIntegral qty * (1 - percent / 100)
49
+
50
+ -- | まとめ買い価格
51
+ bulkPricing :: Int -> Double -> PricingStrategy
52
+ bulkPricing threshold percent = PricingStrategy $ \prod qty ->
53
+ let basePrice = productBasePrice prod * fromIntegral qty
54
+ in if qty >= threshold
55
+ then basePrice * (1 - percent / 100)
56
+ else basePrice
57
+ ```
58
+
59
+ ## 割引デコレータ (Decorator パターン)
60
+
61
+ ```haskell
62
+ -- | 割引デコレータ
63
+ type DiscountDecorator = Double -> Double
64
+
65
+ -- | パーセント割引
66
+ percentageDiscount :: Double -> DiscountDecorator
67
+ percentageDiscount percent price = price * (1 - percent / 100)
68
+
69
+ -- | 固定額割引
70
+ fixedDiscount :: Double -> DiscountDecorator
71
+ fixedDiscount amount price = max 0 (price - amount)
72
+
73
+ -- | 季節割引
74
+ seasonalDiscount :: Double -> DiscountDecorator
75
+ seasonalDiscount multiplier price = price * multiplier
76
+
77
+ -- | 複数割引の適用
78
+ applyDiscounts :: [DiscountDecorator] -> Double -> Double
79
+ applyDiscounts decorators price = foldl' (\p d -> d p) price decorators
80
+ ```
81
+
82
+ ## 注文コマンド (Command パターン)
83
+
84
+ ```haskell
85
+ -- | 注文コマンド型クラス
86
+ class OrderCommand cmd where
87
+ execute :: cmd -> ShoppingCart -> ShoppingCart
88
+
89
+ -- | 商品追加コマンド
90
+ data AddItem = AddItem Product Int
91
+
92
+ instance OrderCommand AddItem where
93
+ execute (AddItem prod qty) cart =
94
+ let item = CartItem prod qty (productBasePrice prod)
95
+ newItems = item : scItems cart
96
+ in cart { scItems = newItems }
97
+
98
+ -- | 商品削除コマンド
99
+ data RemoveItem = RemoveItem String
100
+
101
+ instance OrderCommand RemoveItem where
102
+ execute (RemoveItem prodId) cart =
103
+ let newItems = filter (\item -> productId (ciProduct item) /= prodId) (scItems cart)
104
+ in cart { scItems = newItems }
105
+
106
+ -- | 割引適用コマンド
107
+ data ApplyDiscount = ApplyDiscount DiscountDecorator
108
+
109
+ instance OrderCommand ApplyDiscount where
110
+ execute (ApplyDiscount discount) cart =
111
+ cart { scDiscount = Just discount }
112
+ ```
113
+
114
+ ## ショッピングカート (Composite パターン)
115
+
116
+ ```haskell
117
+ -- | カートアイテム
118
+ data CartItem = CartItem
119
+ { ciProduct :: Product
120
+ , ciQuantity :: Int
121
+ , ciUnitPrice :: Double
122
+ } deriving (Show, Eq)
123
+
124
+ -- | ショッピングカート
125
+ data ShoppingCart = ShoppingCart
126
+ { scItems :: [CartItem]
127
+ , scDiscount :: Maybe DiscountDecorator
128
+ }
129
+
130
+ -- | 空のカート
131
+ emptyCart :: ShoppingCart
132
+ emptyCart = ShoppingCart [] Nothing
133
+
134
+ -- | カート合計
135
+ cartTotal :: ShoppingCart -> Double
136
+ cartTotal cart =
137
+ let subtotal = sum [ciUnitPrice item * fromIntegral (ciQuantity item)
138
+ | item <- scItems cart]
139
+ in case scDiscount cart of
140
+ Nothing -> subtotal
141
+ Just discount -> discount subtotal
142
+ ```
143
+
144
+ ## 注文処理パイプライン
145
+
146
+ ```haskell
147
+ -- | 注文処理結果
148
+ data OrderResult
149
+ = OrderSuccess ShoppingCart
150
+ | OrderFailure String
151
+
152
+ -- | パイプラインステップ
153
+ type OrderPipeline = ShoppingCart -> OrderResult
154
+
155
+ -- | 検証ステップ
156
+ validationStep :: OrderPipeline
157
+ validationStep cart =
158
+ if null (scItems cart)
159
+ then OrderFailure "Cart is empty"
160
+ else OrderSuccess cart
161
+
162
+ -- | 割引ステップ
163
+ discountStep :: Double -> OrderPipeline
164
+ discountStep percent cart =
165
+ OrderSuccess cart { scDiscount = Just (percentageDiscount percent) }
166
+
167
+ -- | パイプライン実行
168
+ runPipeline :: [OrderPipeline] -> ShoppingCart -> OrderResult
169
+ runPipeline [] cart = OrderSuccess cart
170
+ runPipeline (step:steps) cart =
171
+ case step cart of
172
+ OrderFailure msg -> OrderFailure msg
173
+ OrderSuccess cart' -> runPipeline steps cart'
174
+ ```
175
+
176
+ ## カート分析ビジター (Visitor パターン)
177
+
178
+ ```haskell
179
+ -- | カートビジター
180
+ newtype CartVisitor a = CartVisitor
181
+ { runVisitor :: ShoppingCart -> a
182
+ }
183
+
184
+ -- | アイテム数カウント
185
+ itemCountVisitor :: CartVisitor Int
186
+ itemCountVisitor = CartVisitor $ \cart ->
187
+ sum [ciQuantity item | item <- scItems cart]
188
+
189
+ -- | 合計金額
190
+ totalValueVisitor :: CartVisitor Double
191
+ totalValueVisitor = CartVisitor cartTotal
192
+
193
+ -- | 平均単価
194
+ averageItemPriceVisitor :: CartVisitor Double
195
+ averageItemPriceVisitor = CartVisitor $ \cart ->
196
+ let items = scItems cart
197
+ count = length items
198
+ in if count == 0
199
+ then 0
200
+ else sum [ciUnitPrice item | item <- items] / fromIntegral count
201
+
202
+ -- | ビジターの適用
203
+ visitCart :: CartVisitor a -> ShoppingCart -> a
204
+ visitCart visitor cart = runVisitor visitor cart
205
+ ```
206
+
207
+ ## 使用例
208
+
209
+ ### 完全な注文フロー
210
+
211
+ ```haskell
212
+ -- 商品の定義
213
+ laptop = makeProduct "P001" "Laptop" 1000.0 "Electronics"
214
+ mouse = makeProduct "P002" "Mouse" 50.0 "Electronics"
215
+
216
+ -- コマンドを使ってカートを構築
217
+ cart1 = executeCommand (AddItem laptop 1) emptyCart
218
+ cart2 = executeCommand (AddItem mouse 2) cart1
219
+ cart3 = executeCommand (ApplyDiscount (percentageDiscount 5)) cart2
220
+
221
+ -- パイプラインで処理
222
+ pipeline = [validationStep]
223
+ result = runPipeline pipeline cart3
224
+
225
+ -- ビジターで分析
226
+ case result of
227
+ OrderSuccess cart -> do
228
+ putStrLn $ "Items: " ++ show (visitCart itemCountVisitor cart)
229
+ putStrLn $ "Total: $" ++ show (visitCart totalValueVisitor cart)
230
+ OrderFailure msg -> putStrLn $ "Error: " ++ msg
231
+
232
+ -- 出力:
233
+ -- Items: 3
234
+ -- Total: $1045.0 (1100 * 0.95)
235
+ ```
236
+
237
+ ### パターンの協調
238
+
239
+ ```haskell
240
+ -- Strategy: 価格戦略を選択
241
+ strategy = if isBulkOrder then bulkPricing 10 15 else regularPricing
242
+
243
+ -- Decorator: 割引を積み重ね
244
+ discounts = [percentageDiscount 10, fixedDiscount 50]
245
+ finalPrice = applyDiscounts discounts basePrice
246
+
247
+ -- Command: 操作をデータ化
248
+ commands = [AddItem prod1 1, AddItem prod2 2, ApplyDiscount (percentageDiscount 5)]
249
+ cart = foldl (\c cmd -> executeCommand cmd c) emptyCart commands
250
+
251
+ -- Visitor: カートを分析
252
+ stats = (visitCart itemCountVisitor cart, visitCart totalValueVisitor cart)
253
+ ```
254
+
255
+ ## テスト
256
+
257
+ ```haskell
258
+ spec :: Spec
259
+ spec = do
260
+ describe "Pattern Integration" $ do
261
+ it "processes complete order with multiple patterns" $ do
262
+ let product1 = makeProduct "P001" "Laptop" 1000.0 "Electronics"
263
+ product2 = makeProduct "P002" "Mouse" 50.0 "Electronics"
264
+
265
+ -- コマンドでカートを構築
266
+ cart1 = executeCommand (AddItem product1 1) emptyCart
267
+ cart2 = executeCommand (AddItem product2 2) cart1
268
+ cart3 = executeCommand (ApplyDiscount (percentageDiscount 5)) cart2
269
+
270
+ -- パイプラインで処理
271
+ pipeline' = [validationStep]
272
+
273
+ case runPipeline pipeline' cart3 of
274
+ OrderSuccess cart' -> do
275
+ visitCart itemCountVisitor cart' `shouldBe` 3
276
+ cartTotal cart' `shouldBe` 1045.0
277
+ OrderFailure _ -> expectationFailure "Order should succeed"
278
+ ```
279
+
280
+ ## パターン組み合わせの原則
281
+
282
+ ### 1. 責任の分離
283
+
284
+ 各パターンは単一の責任を持つ:
285
+ - Strategy: 価格計算方法
286
+ - Decorator: 価格修飾
287
+ - Command: 操作のカプセル化
288
+ - Composite: 構造の管理
289
+ - Visitor: 横断的な処理
290
+
291
+ ### 2. 合成可能性
292
+
293
+ パターンは互いに干渉せず、組み合わせ可能:
294
+
295
+ ```haskell
296
+ -- どのパターンも独立して使用可能
297
+ price1 = applyPricing regularPricing product 1
298
+ price2 = percentageDiscount 10 price1
299
+ cart = executeCommand (AddItem product 1) emptyCart
300
+ count = visitCart itemCountVisitor cart
301
+ ```
302
+
303
+ ### 3. 型による安全性
304
+
305
+ 型システムが不正な組み合わせを防止:
306
+
307
+ ```haskell
308
+ -- 型クラスで操作を統一
309
+ class OrderCommand cmd where
310
+ execute :: cmd -> ShoppingCart -> ShoppingCart
311
+
312
+ -- 新しいコマンドの追加が安全
313
+ data NewCommand = ...
314
+ instance OrderCommand NewCommand where
315
+ execute = ...
316
+ ```
317
+
318
+ ## まとめ
319
+
320
+ - 複数のパターンを組み合わせることで、複雑な問題を分割統治できる
321
+ - 各パターンは独立して進化・テスト可能
322
+ - 関数型アプローチにより、パターンの合成が自然になる
323
+ - 型システムにより、安全なパターンの組み合わせが保証される
@@ -0,0 +1,403 @@
1
+ # 第21章 関数型プログラミングのベストプラクティス
2
+
3
+ ## 概要
4
+
5
+ この章では、Haskell での関数型プログラミングにおけるベストプラクティスを学びます。不変性、関数合成、純粋関数、エラーハンドリング、型安全性などの重要な原則を実践的に示します。
6
+
7
+ ## 学習目標
8
+
9
+ - 不変性を活用したコード設計
10
+ - 関数合成によるパイプライン構築
11
+ - 純粋関数と参照透過性の維持
12
+ - 安全なエラーハンドリング
13
+ - 型システムによる堅牢性向上
14
+
15
+ ## 不変性の実践
16
+
17
+ ### レコードの不変更新
18
+
19
+ ```haskell
20
+ -- | ユーザーレコード
21
+ data User = User
22
+ { userName :: String
23
+ , userEmail :: String
24
+ , userAge :: Int
25
+ } deriving (Show, Eq)
26
+
27
+ -- | 名前の更新(元のデータは変更しない)
28
+ updateUserName :: String -> User -> User
29
+ updateUserName newName user = user { userName = newName }
30
+
31
+ -- | メールの更新
32
+ updateUserEmail :: String -> User -> User
33
+ updateUserEmail newEmail user = user { userEmail = newEmail }
34
+
35
+ -- | 年齢の更新
36
+ updateUserAge :: Int -> User -> User
37
+ updateUserAge newAge user = user { userAge = newAge }
38
+
39
+ -- 使用例
40
+ let alice = User "Alice" "alice@example.com" 30
41
+ let bob = updateUserName "Bob" alice
42
+ -- alice は変更されない
43
+ -- bob は新しい User
44
+ ```
45
+
46
+ ### 汎用更新関数
47
+
48
+ ```haskell
49
+ -- | 任意の更新関数を適用
50
+ updateUser :: (User -> User) -> User -> User
51
+ updateUser f = f
52
+
53
+ -- 複数の更新を合成
54
+ updateAll :: User -> User
55
+ updateAll = updateUserName "Charlie"
56
+ . updateUserEmail "charlie@example.com"
57
+ . updateUserAge 25
58
+ ```
59
+
60
+ ## 関数合成
61
+
62
+ ### パイプライン演算子
63
+
64
+ ```haskell
65
+ -- | 前方パイプ
66
+ (|>) :: a -> (a -> b) -> b
67
+ x |> f = f x
68
+ infixl 1 |>
69
+
70
+ -- | 後方パイプ
71
+ (<|) :: (a -> b) -> a -> b
72
+ f <| x = f x
73
+ infixr 0 <|
74
+
75
+ -- 使用例
76
+ result = " HELLO WORLD "
77
+ |> trim
78
+ |> toLowerCase
79
+ |> removeSpaces
80
+ -- "helloworld"
81
+ ```
82
+
83
+ ### 関数のパイプライン化
84
+
85
+ ```haskell
86
+ -- | パイプラインの作成
87
+ pipeline :: [a -> a] -> a -> a
88
+ pipeline = foldl' (flip (.)) id
89
+
90
+ -- 使用例
91
+ sanitize = pipeline [trim, toLowerCase, removeSpaces]
92
+ result = sanitize " Hello World " -- "helloworld"
93
+ ```
94
+
95
+ ### 文字列変換関数
96
+
97
+ ```haskell
98
+ -- | 空白のトリム
99
+ trim :: String -> String
100
+ trim = dropWhile isSpace . reverse . dropWhile isSpace . reverse
101
+
102
+ -- | 小文字化
103
+ toLowerCase :: String -> String
104
+ toLowerCase = map toLower
105
+
106
+ -- | 空白除去
107
+ removeSpaces :: String -> String
108
+ removeSpaces = filter (not . isSpace)
109
+
110
+ -- | 入力のサニタイズ
111
+ sanitizeInput :: String -> String
112
+ sanitizeInput = toLowerCase . trim
113
+ ```
114
+
115
+ ## 純粋関数
116
+
117
+ ### 参照透過性
118
+
119
+ ```haskell
120
+ -- | 純粋な加算
121
+ pureAdd :: Num a => a -> a -> a
122
+ pureAdd x y = x + y
123
+
124
+ -- | 純粋な乗算
125
+ pureMultiply :: Num a => a -> a -> a
126
+ pureMultiply x y = x * y
127
+
128
+ -- | 純粋な計算
129
+ pureCompute :: Int -> Int -> Int -> Int
130
+ pureCompute x y z = (x + y) * z
131
+
132
+ -- 同じ入力には常に同じ出力
133
+ pureCompute 2 3 4 -- 常に 20
134
+ pureCompute 2 3 4 -- 常に 20
135
+ ```
136
+
137
+ ### 副作用の分離
138
+
139
+ ```haskell
140
+ -- | 計算の抽象化
141
+ data Computation a
142
+ = Pure a
143
+ | Effect (IO a)
144
+
145
+ instance Functor Computation where
146
+ fmap f (Pure a) = Pure (f a)
147
+ fmap f (Effect io) = Effect (fmap f io)
148
+
149
+ -- | 純粋な計算ステップ
150
+ pureStep :: a -> Computation a
151
+ pureStep = Pure
152
+
153
+ -- | 計算の実行
154
+ runComputation :: Computation a -> IO a
155
+ runComputation (Pure a) = return a
156
+ runComputation (Effect io) = io
157
+ ```
158
+
159
+ ## エラーハンドリング
160
+
161
+ ### Result 型
162
+
163
+ ```haskell
164
+ -- | 結果型
165
+ data Result e a
166
+ = Success a
167
+ | Failure e
168
+ deriving (Show, Eq)
169
+
170
+ -- | 結果のマップ
171
+ mapResult :: (a -> b) -> Result e a -> Result e b
172
+ mapResult f (Success a) = Success (f a)
173
+ mapResult _ (Failure e) = Failure e
174
+
175
+ -- | 結果のフラットマップ
176
+ flatMapResult :: (a -> Result e b) -> Result e a -> Result e b
177
+ flatMapResult f (Success a) = f a
178
+ flatMapResult _ (Failure e) = Failure e
179
+
180
+ -- | Maybe から Result への変換
181
+ fromMaybe' :: e -> Maybe a -> Result e a
182
+ fromMaybe' _ (Just a) = Success a
183
+ fromMaybe' e Nothing = Failure e
184
+ ```
185
+
186
+ ### バリデーション
187
+
188
+ ```haskell
189
+ -- | バリデーション結果
190
+ data Validation e a
191
+ = Valid a
192
+ | Invalid [e]
193
+ deriving (Show, Eq)
194
+
195
+ -- | 単一のバリデーション
196
+ validate :: (a -> Bool) -> e -> a -> Validation e a
197
+ validate predicate err value =
198
+ if predicate value
199
+ then Valid value
200
+ else Invalid [err]
201
+
202
+ -- | 複数ルールのバリデーション
203
+ validateAll :: [(a -> Bool, e)] -> a -> Validation e a
204
+ validateAll rules value =
205
+ let errors = [err | (predicate, err) <- rules, not (predicate value)]
206
+ in if null errors
207
+ then Valid value
208
+ else Invalid errors
209
+
210
+ -- 使用例
211
+ validateAge :: Int -> Validation String Int
212
+ validateAge = validateAll
213
+ [ ((>= 0), "Age must be non-negative")
214
+ , ((<= 150), "Age must be realistic")
215
+ ]
216
+
217
+ validateAge 25 -- Valid 25
218
+ validateAge (-5) -- Invalid ["Age must be non-negative"]
219
+ validateAge 200 -- Invalid ["Age must be realistic"]
220
+ ```
221
+
222
+ ### バリデーションの合成
223
+
224
+ ```haskell
225
+ -- | 複数バリデーションの結合
226
+ combineValidations :: [Validation e a] -> Validation e [a]
227
+ combineValidations validations =
228
+ let (valids, invalids) = partitionValidations validations
229
+ in if null invalids
230
+ then Valid valids
231
+ else Invalid (concat invalids)
232
+
233
+ -- 使用例
234
+ let v1 = validate (> 0) "must be positive" 5
235
+ v2 = validate (< 100) "must be < 100" 50
236
+ combineValidations [v1, v2] -- Valid [5, 50]
237
+ ```
238
+
239
+ ## データ変換
240
+
241
+ ### Map/Filter/Reduce
242
+
243
+ ```haskell
244
+ -- | マップ
245
+ mapOver :: (a -> b) -> [a] -> [b]
246
+ mapOver = map
247
+
248
+ -- | フィルター
249
+ filterBy :: (a -> Bool) -> [a] -> [a]
250
+ filterBy = filter
251
+
252
+ -- | リデュース
253
+ reduceWith :: (b -> a -> b) -> b -> [a] -> b
254
+ reduceWith = foldl'
255
+
256
+ -- | 変換パイプライン
257
+ transformPipeline :: (a -> b) -> (b -> Bool) -> (c -> b -> c) -> c -> [a] -> c
258
+ transformPipeline mapF filterF reduceF initial xs =
259
+ reduceWith reduceF initial (filterBy filterF (mapOver mapF xs))
260
+
261
+ -- 使用例:偶数を2倍して合計
262
+ result = transformPipeline (*2) even (+) 0 [1..5] -- 12
263
+ ```
264
+
265
+ ### 遅延評価
266
+
267
+ ```haskell
268
+ -- | 遅延レンジ
269
+ lazyRange :: Int -> Int -> [Int]
270
+ lazyRange start end = [start..end]
271
+
272
+ -- | 条件付き取得
273
+ takeWhile' :: (a -> Bool) -> [a] -> [a]
274
+ takeWhile' = takeWhile
275
+
276
+ -- | 無限シーケンス
277
+ infiniteSequence :: a -> (a -> a) -> [a]
278
+ infiniteSequence start next = iterate next start
279
+
280
+ -- 使用例
281
+ take 5 (infiniteSequence 1 (+1)) -- [1, 2, 3, 4, 5]
282
+ take 5 (infiniteSequence 2 (*2)) -- [2, 4, 8, 16, 32]
283
+ takeWhile' (< 100) (infiniteSequence 1 (*2)) -- [1, 2, 4, 8, 16, 32, 64]
284
+ ```
285
+
286
+ ## 型安全性
287
+
288
+ ### Newtype パターン
289
+
290
+ ```haskell
291
+ -- | Email newtype
292
+ newtype Email = Email { unEmail :: String }
293
+ deriving (Show, Eq)
294
+
295
+ -- | スマートコンストラクタ
296
+ mkEmail :: String -> Maybe Email
297
+ mkEmail s
298
+ | '@' `elem` s && '.' `elem` dropWhile (/= '@') s = Just (Email s)
299
+ | otherwise = Nothing
300
+
301
+ -- | Username newtype
302
+ newtype Username = Username { unUsername :: String }
303
+ deriving (Show, Eq)
304
+
305
+ mkUsername :: String -> Maybe Username
306
+ mkUsername s
307
+ | length s >= 3 && length s <= 20 = Just (Username s)
308
+ | otherwise = Nothing
309
+
310
+ -- | Age newtype
311
+ newtype Age = Age { unAge :: Int }
312
+ deriving (Show, Eq)
313
+
314
+ mkAge :: Int -> Maybe Age
315
+ mkAge n
316
+ | n >= 0 && n <= 150 = Just (Age n)
317
+ | otherwise = Nothing
318
+ ```
319
+
320
+ ### 正の整数
321
+
322
+ ```haskell
323
+ -- | 正の整数
324
+ newtype PositiveInt = PositiveInt { unPositiveInt :: Int }
325
+ deriving (Show, Eq)
326
+
327
+ mkPositiveInt :: Int -> Maybe PositiveInt
328
+ mkPositiveInt n
329
+ | n > 0 = Just (PositiveInt n)
330
+ | otherwise = Nothing
331
+
332
+ -- | 空でない文字列
333
+ newtype NonEmptyString = NonEmptyString { unNonEmptyString :: String }
334
+ deriving (Show, Eq)
335
+
336
+ mkNonEmptyString :: String -> Maybe NonEmptyString
337
+ mkNonEmptyString s
338
+ | null s = Nothing
339
+ | otherwise = Just (NonEmptyString s)
340
+ ```
341
+
342
+ ## テストのベストプラクティス
343
+
344
+ ### 代数的性質のテスト
345
+
346
+ ```haskell
347
+ -- | 結合律のテスト
348
+ associative :: Eq a => (a -> a -> a) -> a -> a -> a -> Bool
349
+ associative f a b c = f (f a b) c == f a (f b c)
350
+
351
+ -- | 交換律のテスト
352
+ commutative :: Eq b => (a -> a -> b) -> a -> a -> Bool
353
+ commutative f a b = f a b == f b a
354
+
355
+ -- | 単位元のテスト
356
+ identity' :: Eq a => (a -> a -> a) -> a -> a -> Bool
357
+ identity' f identity a = f a identity == a && f identity a == a
358
+
359
+ -- | 逆元のテスト
360
+ inverse :: Eq a => (a -> a -> a) -> (a -> a) -> a -> a -> Bool
361
+ inverse f inv identity a = f a (inv a) == identity
362
+ ```
363
+
364
+ ### プロパティベーステスト
365
+
366
+ ```haskell
367
+ spec :: Spec
368
+ spec = do
369
+ it "addition is associative" $ property $
370
+ \(x :: Int) y z -> associative (+) x y z
371
+
372
+ it "addition is commutative" $ property $
373
+ \(x :: Int) y -> commutative (+) x y
374
+
375
+ it "0 is identity for addition" $ property $
376
+ \(x :: Int) -> identity' (+) 0 x
377
+ ```
378
+
379
+ ## まとめ
380
+
381
+ ### 不変性の利点
382
+
383
+ - 予測可能な動作
384
+ - 並行処理の安全性
385
+ - デバッグの容易さ
386
+
387
+ ### 関数合成の利点
388
+
389
+ - コードの再利用性
390
+ - 読みやすいパイプライン
391
+ - テストの容易さ
392
+
393
+ ### 型安全性の利点
394
+
395
+ - コンパイル時のエラー検出
396
+ - 不正な状態の防止
397
+ - ドキュメントとしての型
398
+
399
+ ### エラーハンドリングの原則
400
+
401
+ - 例外より戻り値
402
+ - 型でエラーを表現
403
+ - バリデーションの合成