@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,291 @@
1
+ # 第15章: ゴシップ好きなバスの運転手
2
+
3
+ ## はじめに
4
+
5
+ 「ゴシップ好きなバスの運転手」は、バス運転手が停留所で噂を共有するシミュレーション問題です。無限ストリーム(`Stream.cycle`)を使って循環ルートを表現し、集合演算(`MapSet`)で噂の伝播をモデル化します。
6
+
7
+ ## 1. 問題の概要
8
+
9
+ - 複数のバス運転手がそれぞれのルートを循環する
10
+ - 同じ停留所に居合わせたドライバー同士は噂を共有する
11
+ - 全員が全ての噂を知るまでの時間を求める
12
+ - 8時間(480分)以内に共有されない場合は `:never` を返す
13
+
14
+ ## 2. ドライバーの作成と操作
15
+
16
+ ### Driver 構造体
17
+
18
+ ```elixir
19
+ defmodule Driver do
20
+ defstruct [:name, :route, :rumors]
21
+
22
+ def new(name, route, rumors) when is_list(route) do
23
+ %__MODULE__{
24
+ name: name,
25
+ route: Stream.cycle(route), # 無限ストリームで循環ルート
26
+ rumors: MapSet.new(rumors)
27
+ }
28
+ end
29
+
30
+ def current_stop(%__MODULE__{route: route}) do
31
+ Enum.at(route, 0)
32
+ end
33
+
34
+ def move(%__MODULE__{route: route} = driver) do
35
+ %{driver | route: Stream.drop(route, 1)}
36
+ end
37
+
38
+ def set_rumors(%__MODULE__{} = driver, rumors) do
39
+ %{driver | rumors: rumors}
40
+ end
41
+ end
42
+ ```
43
+
44
+ ### 使用例
45
+
46
+ ```elixir
47
+ # ドライバーを作成
48
+ driver = Driver.new("Alice", [1, 2, 3], [:rumor_a])
49
+
50
+ # 現在の停留所
51
+ Driver.current_stop(driver) #=> 1
52
+
53
+ # 次の停留所に移動
54
+ moved = Driver.move(driver)
55
+ Driver.current_stop(moved) #=> 2
56
+
57
+ # ルートは循環する
58
+ driver
59
+ |> Driver.move()
60
+ |> Driver.move()
61
+ |> Driver.move()
62
+ |> Driver.current_stop() #=> 1(最初に戻る)
63
+ ```
64
+
65
+ ## 3. ワールド(世界)の操作
66
+
67
+ ### 停留所の集計
68
+
69
+ ```elixir
70
+ defmodule World do
71
+ def get_stops(drivers) do
72
+ Enum.reduce(drivers, %{}, fn driver, stops ->
73
+ stop = Driver.current_stop(driver)
74
+ Map.update(stops, stop, [driver], &[driver | &1])
75
+ end)
76
+ end
77
+ end
78
+ ```
79
+
80
+ ### 噂の伝播
81
+
82
+ ```elixir
83
+ defmodule World do
84
+ def merge_rumors(drivers) when is_list(drivers) do
85
+ # 全ドライバーの噂を統合
86
+ all_rumors = Enum.reduce(drivers, MapSet.new(), fn driver, acc ->
87
+ MapSet.union(acc, driver.rumors)
88
+ end)
89
+
90
+ # 各ドライバーに統合された噂を設定
91
+ Enum.map(drivers, &Driver.set_rumors(&1, all_rumors))
92
+ end
93
+
94
+ def spread_rumors(drivers) do
95
+ stops = get_stops(drivers)
96
+
97
+ stops
98
+ |> Map.values()
99
+ |> Enum.flat_map(&merge_rumors/1)
100
+ end
101
+ end
102
+ ```
103
+
104
+ ### 1ステップのシミュレーション
105
+
106
+ ```elixir
107
+ def drive(drivers) do
108
+ drivers
109
+ |> move_drivers() # 全員を移動
110
+ |> spread_rumors() # 噂を伝播
111
+ end
112
+
113
+ def move_drivers(drivers) do
114
+ Enum.map(drivers, &Driver.move/1)
115
+ end
116
+ ```
117
+
118
+ ## 4. シミュレーション実行
119
+
120
+ ### 収束判定
121
+
122
+ ```elixir
123
+ def all_rumors_shared?(drivers) do
124
+ rumors_list = Enum.map(drivers, & &1.rumors)
125
+
126
+ case rumors_list do
127
+ [] -> true
128
+ [first | rest] -> Enum.all?(rest, &(&1 == first))
129
+ end
130
+ end
131
+ ```
132
+
133
+ ### メインシミュレーション
134
+
135
+ ```elixir
136
+ defmodule Simulation do
137
+ @max_steps 480 # 8時間
138
+
139
+ def run_until_spread(drivers) do
140
+ run_until_spread(World.drive(drivers), 1)
141
+ end
142
+
143
+ defp run_until_spread(_drivers, step) when step > @max_steps, do: :never
144
+ defp run_until_spread(drivers, step) do
145
+ if World.all_rumors_shared?(drivers) do
146
+ step
147
+ else
148
+ run_until_spread(World.drive(drivers), step + 1)
149
+ end
150
+ end
151
+ end
152
+ ```
153
+
154
+ ### 使用例
155
+
156
+ ```elixir
157
+ # ドライバーを作成
158
+ drivers = [
159
+ Driver.new("D1", [3, 1, 2, 3], [:r1]),
160
+ Driver.new("D2", [3, 2, 3, 1], [:r2]),
161
+ Driver.new("D3", [4, 2, 3, 4, 5], [:r3])
162
+ ]
163
+
164
+ # シミュレーション実行
165
+ steps = Simulation.run_until_spread(drivers)
166
+ #=> 例: 5(5ステップで全噂が共有された)
167
+ ```
168
+
169
+ ## 5. 問題ソルバー
170
+
171
+ ```elixir
172
+ defmodule Solver do
173
+ def solve(routes) when is_list(routes) do
174
+ drivers =
175
+ routes
176
+ |> Enum.with_index(1)
177
+ |> Enum.map(fn {route, idx} ->
178
+ rumor = String.to_atom("rumor_#{idx}")
179
+ Driver.new("Driver_#{idx}", route, [rumor])
180
+ end)
181
+
182
+ Simulation.run_until_spread(drivers)
183
+ end
184
+
185
+ def parse_and_solve(input) when is_binary(input) do
186
+ routes =
187
+ input
188
+ |> String.trim()
189
+ |> String.split("\n")
190
+ |> Enum.map(fn line ->
191
+ line
192
+ |> String.split()
193
+ |> Enum.map(&String.to_integer/1)
194
+ end)
195
+
196
+ solve(routes)
197
+ end
198
+ end
199
+ ```
200
+
201
+ ### 使用例
202
+
203
+ ```elixir
204
+ # ルートリストから解く
205
+ routes = [[3, 1, 2, 3], [3, 2, 3, 1], [4, 2, 3, 4, 5]]
206
+ Solver.solve(routes)
207
+
208
+ # テキスト入力から解く
209
+ input = """
210
+ 3 1 2 3
211
+ 3 2 3 1
212
+ 4 2 3 4 5
213
+ """
214
+ Solver.parse_and_solve(input)
215
+ ```
216
+
217
+ ## 6. 設計のポイント
218
+
219
+ ### 無限ストリームの活用
220
+
221
+ `Stream.cycle/1` を使用することで、循環ルートを自然に表現できます。
222
+
223
+ ```elixir
224
+ route = Stream.cycle([1, 2, 3])
225
+ Enum.take(route, 7) #=> [1, 2, 3, 1, 2, 3, 1]
226
+ ```
227
+
228
+ ### 不変データ構造
229
+
230
+ ドライバーの状態は不変で、移動や噂の更新は常に新しい構造体を返します。
231
+
232
+ ```elixir
233
+ # 元のドライバーは変更されない
234
+ driver = Driver.new("Alice", [1, 2], [:a])
235
+ moved = Driver.move(driver)
236
+
237
+ Driver.current_stop(driver) #=> 1(元のまま)
238
+ Driver.current_stop(moved) #=> 2(新しい状態)
239
+ ```
240
+
241
+ ### 集合演算による噂の統合
242
+
243
+ `MapSet.union/2` を使用して、噂の統合を簡潔に表現できます。
244
+
245
+ ```elixir
246
+ rumors1 = MapSet.new([:a, :b])
247
+ rumors2 = MapSet.new([:b, :c])
248
+ MapSet.union(rumors1, rumors2) #=> MapSet.new([:a, :b, :c])
249
+ ```
250
+
251
+ ### 遅延評価
252
+
253
+ `Stream` を使用することで、無限シーケンスでもメモリ効率良く処理できます。
254
+
255
+ ## 7. サンプル問題
256
+
257
+ ### 出会わないケース
258
+
259
+ ```elixir
260
+ drivers = [
261
+ Driver.new("D1", [1], [:r1]), # 停留所1に固定
262
+ Driver.new("D2", [2], [:r2]) # 停留所2に固定
263
+ ]
264
+
265
+ Simulation.run_until_spread(drivers) #=> :never
266
+ ```
267
+
268
+ ### すぐに出会うケース
269
+
270
+ ```elixir
271
+ drivers = [
272
+ Driver.new("D1", [1, 2], [:r1]),
273
+ Driver.new("D2", [1, 3], [:r2]),
274
+ Driver.new("D3", [1, 4], [:r3])
275
+ ]
276
+
277
+ # 全員が最初から停留所1にいるので、1ステップ目で噂が共有される
278
+ Simulation.run_until_spread(drivers) #=> 1
279
+ ```
280
+
281
+ ## まとめ
282
+
283
+ この問題は以下の関数型プログラミングの概念を活用しています:
284
+
285
+ 1. **無限ストリーム**: `Stream.cycle` で循環ルートを表現
286
+ 2. **不変データ構造**: 状態変更は常に新しいデータを返す
287
+ 3. **集合演算**: `MapSet` で噂の統合を簡潔に実装
288
+ 4. **再帰とパターンマッチ**: シミュレーションの終了条件を明確に表現
289
+ 5. **高階関数**: `Enum.map`, `Enum.reduce`, `Enum.filter` でデータ変換
290
+
291
+ Elixir の強力なストリーム処理と不変データ構造により、シミュレーション問題を宣言的に記述できます。
@@ -0,0 +1,420 @@
1
+ # 第16章: 給与計算システム
2
+
3
+ ## はじめに
4
+
5
+ 給与計算システムは、従業員の給与計算と支払い処理を統合的に管理するシステムです。パターンマッチングによる多態性を活用して、異なる給与タイプに対応した計算ロジックを実装します。
6
+
7
+ ## 1. 従業員モデル
8
+
9
+ ### Employee 構造体
10
+
11
+ ```elixir
12
+ defmodule Employee do
13
+ @type pay_type :: :salaried | :hourly | :commissioned
14
+ @type schedule :: :monthly | :weekly | :biweekly
15
+ @type payment_method :: :hold | :direct_deposit | :mail
16
+
17
+ defstruct [
18
+ :id,
19
+ :name,
20
+ :address,
21
+ :pay_class,
22
+ :schedule,
23
+ :payment_method
24
+ ]
25
+ end
26
+ ```
27
+
28
+ ### 従業員の作成
29
+
30
+ ```elixir
31
+ # 月給制従業員
32
+ def make_salaried(id, name, salary) do
33
+ %Employee{
34
+ id: id,
35
+ name: name,
36
+ pay_class: {:salaried, salary},
37
+ schedule: :monthly,
38
+ payment_method: :hold
39
+ }
40
+ end
41
+
42
+ # 時給制従業員
43
+ def make_hourly(id, name, hourly_rate) do
44
+ %Employee{
45
+ id: id,
46
+ name: name,
47
+ pay_class: {:hourly, hourly_rate},
48
+ schedule: :weekly,
49
+ payment_method: :hold
50
+ }
51
+ end
52
+
53
+ # 歩合制従業員
54
+ def make_commissioned(id, name, base_pay, commission_rate) do
55
+ %Employee{
56
+ id: id,
57
+ name: name,
58
+ pay_class: {:commissioned, base_pay, commission_rate},
59
+ schedule: :biweekly,
60
+ payment_method: :hold
61
+ }
62
+ end
63
+ ```
64
+
65
+ ### 使用例
66
+
67
+ ```elixir
68
+ # 月給50万円の従業員
69
+ salaried = Employee.make_salaried("E001", "田中太郎", 500_000)
70
+
71
+ # 時給1500円の従業員
72
+ hourly = Employee.make_hourly("E002", "佐藤花子", 1500)
73
+
74
+ # 基本給20万円 + 売上の10%の従業員
75
+ commissioned = Employee.make_commissioned("E003", "鈴木一郎", 200_000, 0.1)
76
+ ```
77
+
78
+ ## 2. 給与計算
79
+
80
+ ### パターンマッチングによる計算
81
+
82
+ ```elixir
83
+ defmodule Classification do
84
+ # 月給制:そのまま月給を返す
85
+ def calc_pay(%Employee{pay_class: {:salaried, salary}}, _context) do
86
+ salary
87
+ end
88
+
89
+ # 時給制:タイムカードから計算(残業は1.5倍)
90
+ def calc_pay(%Employee{pay_class: {:hourly, hourly_rate}} = employee, context) do
91
+ time_cards = get_in(context, [:time_cards, Employee.get_id(employee)]) || []
92
+ hours = Enum.map(time_cards, fn {_date, hours} -> hours end)
93
+ total_hours = Enum.sum(hours)
94
+
95
+ regular_hours = min(total_hours, 40)
96
+ overtime_hours = max(0, total_hours - 40)
97
+
98
+ regular_hours * hourly_rate + overtime_hours * hourly_rate * 1.5
99
+ end
100
+
101
+ # 歩合制:基本給 + 売上 × コミッション率
102
+ def calc_pay(%Employee{pay_class: {:commissioned, base_pay, commission_rate}} = employee, context) do
103
+ sales_receipts = get_in(context, [:sales_receipts, Employee.get_id(employee)]) || []
104
+ total_sales = Enum.sum(Enum.map(sales_receipts, fn {_date, amount} -> amount end))
105
+
106
+ base_pay + total_sales * commission_rate
107
+ end
108
+ end
109
+ ```
110
+
111
+ ### コンテキストの管理
112
+
113
+ ```elixir
114
+ defmodule Classification do
115
+ def make_context do
116
+ %{
117
+ time_cards: %{},
118
+ sales_receipts: %{}
119
+ }
120
+ end
121
+
122
+ def add_time_card(context, employee_id, date, hours) do
123
+ update_in(context, [:time_cards, employee_id], fn
124
+ nil -> [{date, hours}]
125
+ cards -> [{date, hours} | cards]
126
+ end)
127
+ end
128
+
129
+ def add_sales_receipt(context, employee_id, date, amount) do
130
+ update_in(context, [:sales_receipts, employee_id], fn
131
+ nil -> [{date, amount}]
132
+ receipts -> [{date, amount} | receipts]
133
+ end)
134
+ end
135
+ end
136
+ ```
137
+
138
+ ### 使用例
139
+
140
+ ```elixir
141
+ # 時給制従業員の給与計算
142
+ hourly = Employee.make_hourly("E002", "佐藤", 1500)
143
+ ctx =
144
+ Classification.make_context()
145
+ |> Classification.add_time_card("E002", "2024-01-15", 8)
146
+ |> Classification.add_time_card("E002", "2024-01-16", 8)
147
+
148
+ Classification.calc_pay(hourly, ctx) #=> 24000.0
149
+
150
+ # 残業を含む場合
151
+ ctx_overtime =
152
+ Classification.make_context()
153
+ |> Classification.add_time_card("E002", "2024-01-15", 45)
154
+
155
+ Classification.calc_pay(hourly, ctx_overtime)
156
+ #=> 40 * 1500 + 5 * 1500 * 1.5 = 67500.0
157
+ ```
158
+
159
+ ## 3. 支払いスケジュール
160
+
161
+ ```elixir
162
+ defmodule Schedule do
163
+ # 月給制:月末が支払日
164
+ def is_pay_day?(%Employee{schedule: :monthly}, date) do
165
+ is_last_day_of_month?(date)
166
+ end
167
+
168
+ # 時給制:毎週金曜日
169
+ def is_pay_day?(%Employee{schedule: :weekly}, date) do
170
+ Map.get(date, :day_of_week) == :friday
171
+ end
172
+
173
+ # 歩合制:隔週金曜日
174
+ def is_pay_day?(%Employee{schedule: :biweekly}, date) do
175
+ Map.get(date, :day_of_week) == :friday and
176
+ Map.get(date, :is_pay_week, false) == true
177
+ end
178
+
179
+ # 日付ファクトリ
180
+ def end_of_month(year, month), do: # ...
181
+ def friday(year, month, day), do: # ...
182
+ def pay_friday(year, month, day), do: # ...
183
+ end
184
+ ```
185
+
186
+ ## 4. 支払い処理
187
+
188
+ ```elixir
189
+ defmodule Payment do
190
+ def process(%Employee{payment_method: :hold} = employee, amount) do
191
+ %{
192
+ type: :hold,
193
+ employee_id: Employee.get_id(employee),
194
+ amount: amount,
195
+ message: "支払いを保留"
196
+ }
197
+ end
198
+
199
+ def process(%Employee{payment_method: :direct_deposit} = employee, amount) do
200
+ %{
201
+ type: :direct_deposit,
202
+ employee_id: Employee.get_id(employee),
203
+ amount: amount,
204
+ message: "口座に振り込み"
205
+ }
206
+ end
207
+
208
+ def process(%Employee{payment_method: :mail} = employee, amount) do
209
+ %{
210
+ type: :mail,
211
+ employee_id: Employee.get_id(employee),
212
+ amount: amount,
213
+ message: "小切手を郵送"
214
+ }
215
+ end
216
+ end
217
+ ```
218
+
219
+ ## 5. 給与計算システム
220
+
221
+ ### Payroll モジュール
222
+
223
+ ```elixir
224
+ defmodule Payroll do
225
+ def calculate_pay(employee, context) do
226
+ Classification.calc_pay(employee, context)
227
+ end
228
+
229
+ def calculate_payroll(employees, context) do
230
+ Enum.map(employees, fn emp ->
231
+ %{employee: emp, pay: calculate_pay(emp, context)}
232
+ end)
233
+ end
234
+
235
+ def run_payroll(employees, context, date) do
236
+ employees
237
+ |> Enum.filter(&Schedule.is_pay_day?(&1, date))
238
+ |> Enum.map(fn emp ->
239
+ pay = calculate_pay(emp, context)
240
+ Payment.process(emp, pay)
241
+ end)
242
+ end
243
+
244
+ def payroll_report(employees, context) do
245
+ payroll = calculate_payroll(employees, context)
246
+ total = Enum.sum(Enum.map(payroll, & &1.pay))
247
+
248
+ %{
249
+ employees: Enum.map(payroll, fn %{employee: emp, pay: pay} ->
250
+ %{
251
+ id: Employee.get_id(emp),
252
+ name: Employee.get_name(emp),
253
+ type: Employee.get_pay_type(emp),
254
+ pay: pay
255
+ }
256
+ end),
257
+ total: total,
258
+ count: length(employees)
259
+ }
260
+ end
261
+ end
262
+ ```
263
+
264
+ ## 6. 従業員リポジトリ
265
+
266
+ ```elixir
267
+ defmodule EmployeeRepository do
268
+ def start_link do
269
+ Agent.start_link(fn -> %{} end)
270
+ end
271
+
272
+ def add(pid, %Employee{} = employee) do
273
+ Agent.update(pid, &Map.put(&1, employee.id, employee))
274
+ {:ok, employee}
275
+ end
276
+
277
+ def get(pid, id) do
278
+ case Agent.get(pid, &Map.get(&1, id)) do
279
+ nil -> {:error, :not_found}
280
+ employee -> {:ok, employee}
281
+ end
282
+ end
283
+
284
+ def get_all(pid) do
285
+ Agent.get(pid, &Map.values(&1))
286
+ end
287
+
288
+ def update(pid, id, update_fn) do
289
+ Agent.get_and_update(pid, fn state ->
290
+ case Map.get(state, id) do
291
+ nil ->
292
+ {{:error, :not_found}, state}
293
+ employee ->
294
+ updated = update_fn.(employee)
295
+ {{:ok, updated}, Map.put(state, id, updated)}
296
+ end
297
+ end)
298
+ end
299
+
300
+ def delete(pid, id) do
301
+ Agent.get_and_update(pid, fn state ->
302
+ case Map.pop(state, id) do
303
+ {nil, state} -> {{:error, :not_found}, state}
304
+ {employee, state} -> {{:ok, employee}, state}
305
+ end
306
+ end)
307
+ end
308
+ end
309
+ ```
310
+
311
+ ## 7. サービス層
312
+
313
+ ```elixir
314
+ defmodule PayrollService do
315
+ defstruct [:repo, :context]
316
+
317
+ def new do
318
+ {:ok, repo} = EmployeeRepository.start_link()
319
+ %__MODULE__{
320
+ repo: repo,
321
+ context: Classification.make_context()
322
+ }
323
+ end
324
+
325
+ def add_salaried_employee(service, id, name, salary) do
326
+ employee = Employee.make_salaried(id, name, salary)
327
+ EmployeeRepository.add(service.repo, employee)
328
+ end
329
+
330
+ def add_time_card(%__MODULE__{context: ctx} = service, employee_id, date, hours) do
331
+ new_ctx = Classification.add_time_card(ctx, employee_id, date, hours)
332
+ %{service | context: new_ctx}
333
+ end
334
+
335
+ def run_payroll(service, date) do
336
+ employees = EmployeeRepository.get_all(service.repo)
337
+ Payroll.run_payroll(employees, service.context, date)
338
+ end
339
+
340
+ def payroll_report(service) do
341
+ employees = EmployeeRepository.get_all(service.repo)
342
+ Payroll.payroll_report(employees, service.context)
343
+ end
344
+ end
345
+ ```
346
+
347
+ ## 8. 完全なワークフロー例
348
+
349
+ ```elixir
350
+ # サービスを作成
351
+ service = PayrollService.new()
352
+
353
+ # 従業員を追加
354
+ PayrollService.add_salaried_employee(service, "E001", "田中太郎", 500_000)
355
+ PayrollService.add_hourly_employee(service, "E002", "佐藤花子", 1500)
356
+ PayrollService.add_commissioned_employee(service, "E003", "鈴木一郎", 200_000, 0.1)
357
+
358
+ # 支払い方法を変更
359
+ PayrollService.change_payment_method(service, "E001", :direct_deposit)
360
+
361
+ # タイムカードを追加
362
+ service = PayrollService.add_time_card(service, "E002", "2024-01-15", 8)
363
+ service = PayrollService.add_time_card(service, "E002", "2024-01-16", 8)
364
+
365
+ # 売上レシートを追加
366
+ service = PayrollService.add_sales_receipt(service, "E003", "2024-01-15", 100_000)
367
+
368
+ # レポートを生成
369
+ report = PayrollService.payroll_report(service)
370
+ #=> %{count: 3, total: 722_000.0, employees: [...]}
371
+
372
+ # 給与を支払い(月末)
373
+ end_of_month = Schedule.end_of_month(2024, 1)
374
+ payments = PayrollService.run_payroll(service, end_of_month)
375
+ #=> 月給制従業員への支払いが処理される
376
+
377
+ # クリーンアップ
378
+ PayrollService.stop(service)
379
+ ```
380
+
381
+ ## 設計のポイント
382
+
383
+ ### パターンマッチングによる多態性
384
+
385
+ Clojure のマルチメソッドに相当する機能を、Elixir ではパターンマッチングで実現しています。
386
+
387
+ ```elixir
388
+ # 給与タイプごとに異なる計算ロジック
389
+ def calc_pay(%Employee{pay_class: {:salaried, salary}}, _), do: salary
390
+ def calc_pay(%Employee{pay_class: {:hourly, rate}}, ctx), do: # ...
391
+ def calc_pay(%Employee{pay_class: {:commissioned, base, rate}}, ctx), do: # ...
392
+ ```
393
+
394
+ ### タプルによる分類データの表現
395
+
396
+ ```elixir
397
+ pay_class: {:salaried, 500_000}
398
+ pay_class: {:hourly, 1500}
399
+ pay_class: {:commissioned, 200_000, 0.1}
400
+ ```
401
+
402
+ ### Agent による状態管理
403
+
404
+ リポジトリは `Agent` を使用して状態を管理します。これにより、関数型の純粋性を保ちながら、必要な箇所でのみ状態を持つことができます。
405
+
406
+ ### コンテキストによる補助データの管理
407
+
408
+ タイムカードや売上レシートは、コンテキスト(マップ)として管理し、必要に応じて給与計算に渡します。
409
+
410
+ ## まとめ
411
+
412
+ 給与計算システムは以下の関数型プログラミングの概念を活用しています:
413
+
414
+ 1. **パターンマッチング**: 給与タイプごとの計算ロジックを明確に分離
415
+ 2. **不変データ構造**: 従業員データの安全な管理
416
+ 3. **高階関数**: リスト処理の簡潔な実装
417
+ 4. **Agent**: 必要最小限の状態管理
418
+ 5. **パイプライン**: データ変換の連鎖的な処理
419
+
420
+ Elixir のパターンマッチングと関数型の特性により、複雑なビジネスロジックを明確かつ保守しやすい形で実装できます。