@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,323 @@
1
+ # 第15章: ゴシップ好きなバスの運転手
2
+
3
+ ## はじめに
4
+
5
+ 本章では、「ゴシップ好きなバスの運転手」という問題を通じて、関数型プログラミングの実践的なアプローチを学びます。この問題は、バス運転手が停留所で出会ったときに噂を共有するというシミュレーションです。
6
+
7
+ この問題を通じて以下の概念を学びます:
8
+
9
+ - 無限シーケンス(`cycle`)による循環データの表現
10
+ - 集合演算による状態の伝播
11
+ - データ変換パイプラインの設計
12
+
13
+ ## 1. 問題の説明
14
+
15
+ 複数のバス運転手がそれぞれのルートを巡回しています。各運転手は最初に1つ以上の噂を知っています。同じ停留所に複数の運転手がいると、彼らは知っている噂をすべて共有します。
16
+
17
+ **ゴール**: 全ての運転手が全ての噂を知るまでに何分かかるか?
18
+
19
+ ```plantuml
20
+ @startuml
21
+ title ゴシップ好きなバスの運転手
22
+
23
+ actor "Driver 1" as d1
24
+ actor "Driver 2" as d2
25
+ actor "Driver 3" as d3
26
+
27
+ rectangle "Stop 1" as s1
28
+ rectangle "Stop 2" as s2
29
+ rectangle "Stop 3" as s3
30
+
31
+ d1 --> s1 : 噂A
32
+ d2 --> s1 : 噂B
33
+ d3 --> s2 : 噂C
34
+
35
+ note bottom of s1
36
+ 同じ停留所にいる運転手は
37
+ 噂を共有する
38
+ D1, D2 => {噂A, 噂B}
39
+ end note
40
+ @enduml
41
+ ```
42
+
43
+ ## 2. データモデル
44
+
45
+ ### ドライバーの表現
46
+
47
+ ```clojure
48
+ (defn make-driver
49
+ "ドライバーを作成する
50
+ name - ドライバーの名前
51
+ route - 停留所のシーケンス
52
+ rumors - 知っている噂の集合"
53
+ [name route rumors]
54
+ {:name name
55
+ :route (cycle route) ; 無限シーケンスで循環ルート
56
+ :rumors rumors})
57
+ ```
58
+
59
+ ポイント:
60
+ - `cycle` 関数で有限のルートを無限の循環シーケンスに変換
61
+ - 噂は集合(set)として管理
62
+
63
+ ### 無限シーケンスの活用
64
+
65
+ ```clojure
66
+ ;; ルート [1 2 3] は無限に繰り返される
67
+ (take 10 (cycle [1 2 3]))
68
+ ;; => (1 2 3 1 2 3 1 2 3 1)
69
+ ```
70
+
71
+ ```plantuml
72
+ @startuml
73
+ title 無限シーケンスによるルート表現
74
+
75
+ rectangle "有限ルート" {
76
+ card "1" as r1
77
+ card "2" as r2
78
+ card "3" as r3
79
+ r1 --> r2
80
+ r2 --> r3
81
+ }
82
+
83
+ rectangle "cycle による無限化" {
84
+ card "1" as c1
85
+ card "2" as c2
86
+ card "3" as c3
87
+ card "1" as c4
88
+ card "..." as dots
89
+ c1 --> c2
90
+ c2 --> c3
91
+ c3 --> c4
92
+ c4 --> dots
93
+ }
94
+
95
+ note bottom
96
+ cycle 関数により
97
+ 有限シーケンスを
98
+ 無限に繰り返す
99
+ end note
100
+ @enduml
101
+ ```
102
+
103
+ ## 3. 移動と噂の伝播
104
+
105
+ ### ドライバーの移動
106
+
107
+ ```clojure
108
+ (defn current-stop
109
+ "ドライバーの現在の停留所を取得"
110
+ [driver]
111
+ (first (:route driver)))
112
+
113
+ (defn move-driver
114
+ "ドライバーを次の停留所に移動"
115
+ [driver]
116
+ (update driver :route rest))
117
+
118
+ (defn move-drivers
119
+ "全ドライバーを次の停留所に移動"
120
+ [world]
121
+ (map move-driver world))
122
+ ```
123
+
124
+ ### 停留所ごとのドライバー集計
125
+
126
+ ```clojure
127
+ (defn get-stops
128
+ "各停留所にいるドライバーをマップとして取得
129
+ {停留所番号 => [ドライバー1, ドライバー2, ...]}"
130
+ [world]
131
+ (loop [world world
132
+ stops {}]
133
+ (if (empty? world)
134
+ stops
135
+ (let [driver (first world)
136
+ stop (current-stop driver)
137
+ stops (update stops stop conj driver)]
138
+ (recur (rest world) stops)))))
139
+ ```
140
+
141
+ ### 噂の共有
142
+
143
+ ```clojure
144
+ (defn merge-rumors
145
+ "同じ停留所にいるドライバー間で噂を共有
146
+ 全員の噂を統合し、各ドライバーに設定"
147
+ [drivers]
148
+ (let [rumors (map :rumors drivers)
149
+ all-rumors (apply set/union rumors)]
150
+ (map #(assoc % :rumors all-rumors) drivers)))
151
+
152
+ (defn spread-rumors
153
+ "全停留所で噂を伝播"
154
+ [world]
155
+ (let [stops-with-drivers (get-stops world)
156
+ drivers-by-stop (vals stops-with-drivers)]
157
+ (flatten (map merge-rumors drivers-by-stop))))
158
+ ```
159
+
160
+ ```plantuml
161
+ @startuml
162
+ title 噂の伝播プロセス
163
+
164
+ participant "Driver 1" as d1
165
+ participant "Stop" as stop
166
+ participant "Driver 2" as d2
167
+
168
+ d1 -> stop : 噂 {A, B}
169
+ d2 -> stop : 噂 {C}
170
+
171
+ stop -> stop : set/union
172
+ note right: {A, B} ∪ {C} = {A, B, C}
173
+
174
+ stop -> d1 : 噂 {A, B, C}
175
+ stop -> d2 : 噂 {A, B, C}
176
+ @enduml
177
+ ```
178
+
179
+ ## 4. シミュレーション
180
+
181
+ ### 1ステップの処理
182
+
183
+ ```clojure
184
+ (defn drive
185
+ "1ステップ分のシミュレーション
186
+ 1. 全ドライバーを移動
187
+ 2. 同じ停留所にいるドライバー間で噂を共有"
188
+ [world]
189
+ (-> world
190
+ move-drivers
191
+ spread-rumors))
192
+ ```
193
+
194
+ ### 完了判定
195
+
196
+ ```clojure
197
+ (defn all-rumors-shared?
198
+ "全ドライバーが同じ噂を持っているか確認"
199
+ [world]
200
+ (apply = (map :rumors world)))
201
+
202
+ (defn drive-till-all-rumors-spread
203
+ "全ての噂が共有されるまでシミュレーション
204
+ 480分(8時間)以内に共有されなければ :never を返す"
205
+ [world]
206
+ (loop [world (drive world)
207
+ time 1]
208
+ (cond
209
+ (> time 480) :never
210
+ (all-rumors-shared? world) time
211
+ :else (recur (drive world) (inc time)))))
212
+ ```
213
+
214
+ ## 5. シーケンス図
215
+
216
+ ```plantuml
217
+ @startuml
218
+ title シミュレーションのフロー
219
+
220
+ participant "Main" as main
221
+ participant "World" as world
222
+ participant "Drivers" as drivers
223
+ participant "Stops" as stops
224
+
225
+ main -> world : drive-till-all-rumors-spread
226
+ activate world
227
+
228
+ loop 全噂が共有されるまで(最大480回)
229
+ world -> drivers : move-drivers
230
+ activate drivers
231
+ drivers --> world : 移動後のドライバー
232
+ deactivate drivers
233
+
234
+ world -> stops : get-stops
235
+ activate stops
236
+ stops --> world : 停留所ごとのドライバー
237
+ deactivate stops
238
+
239
+ world -> world : spread-rumors
240
+ note right: 各停留所で噂を共有
241
+
242
+ world -> world : all-rumors-shared?
243
+ alt 全噂が共有された
244
+ world --> main : 経過時間
245
+ else 480分経過
246
+ world --> main : :never
247
+ end
248
+ end
249
+
250
+ deactivate world
251
+ @enduml
252
+ ```
253
+
254
+ ## 6. 使用例
255
+
256
+ ```clojure
257
+ (require '[gossiping-bus-drivers.core :as gbd])
258
+
259
+ ;; 3人のドライバーを作成
260
+ (def world
261
+ [(gbd/make-driver "D1" [3 1 2 3] #{:rumor-a})
262
+ (gbd/make-driver "D2" [3 2 3 1] #{:rumor-b})
263
+ (gbd/make-driver "D3" [4 2 3 4 5] #{:rumor-c})])
264
+
265
+ ;; シミュレーション実行
266
+ (gbd/drive-till-all-rumors-spread world)
267
+ ;; => 5 (5分で全噂が共有される)
268
+
269
+ ;; 絶対に出会わないルートの場合
270
+ (def never-meet
271
+ [(gbd/make-driver "D1" [1] #{:rumor-a})
272
+ (gbd/make-driver "D2" [2] #{:rumor-b})])
273
+
274
+ (gbd/drive-till-all-rumors-spread never-meet)
275
+ ;; => :never
276
+ ```
277
+
278
+ ## 7. 関数型アプローチの特徴
279
+
280
+ ### 不変データ構造
281
+
282
+ すべての状態変更は新しいデータ構造を返します。元のデータは変更されません。
283
+
284
+ ```clojure
285
+ ;; ドライバーを移動しても元のドライバーは変更されない
286
+ (def original (gbd/make-driver "Test" [1 2 3] #{:a}))
287
+ (def moved (gbd/move-driver original))
288
+
289
+ (gbd/current-stop original) ;; => 1 (変更なし)
290
+ (gbd/current-stop moved) ;; => 2
291
+ ```
292
+
293
+ ### 遅延評価
294
+
295
+ `cycle` による無限シーケンスは遅延評価されるため、メモリを効率的に使用できます。
296
+
297
+ ### 純粋関数
298
+
299
+ すべての関数は副作用がなく、同じ入力に対して常に同じ出力を返します。これによりテストが容易になります。
300
+
301
+ ## 8. パターンの応用
302
+
303
+ このパターンは以下のような場面で応用できます:
304
+
305
+ - **ネットワーク伝播**: ウイルスや情報の拡散シミュレーション
306
+ - **グラフ探索**: 巡回セールスマン問題の変形
307
+ - **状態同期**: 分散システムでの状態共有
308
+
309
+ ## まとめ
310
+
311
+ 本章では、ゴシップ好きなバスの運転手問題を通じて以下を学びました:
312
+
313
+ 1. **無限シーケンス**: `cycle` による循環データの表現
314
+ 2. **集合演算**: `set/union` による状態の統合
315
+ 3. **データ変換パイプライン**: `->` マクロによる処理の連鎖
316
+ 4. **終了条件の設計**: ループと条件分岐の組み合わせ
317
+
318
+ ## 参考コード
319
+
320
+ 本章のコード例は以下のファイルで確認できます:
321
+
322
+ - ソースコード: `apps/clojure/part6/src/gossiping_bus_drivers/`
323
+ - テストコード: `apps/clojure/part6/spec/gossiping_bus_drivers/`
@@ -0,0 +1,401 @@
1
+ # 第16章: 給与計算システム
2
+
3
+ ## はじめに
4
+
5
+ 本章では、給与計算システムを題材に、関数型プログラミングにおけるドメインモデリングとマルチメソッドによる多態性の実現を学びます。
6
+
7
+ この問題を通じて以下の概念を学びます:
8
+
9
+ - Clojure Spec によるデータ仕様定義
10
+ - マルチメソッドによる給与タイプ別の計算
11
+ - 支払いスケジュールのモデリング
12
+
13
+ ## 1. ドメインモデル
14
+
15
+ ### 従業員の給与タイプ
16
+
17
+ 給与計算システムでは、以下の3種類の給与タイプをサポートします:
18
+
19
+ - **月給制(Salaried)**: 固定月給
20
+ - **時給制(Hourly)**: 労働時間に基づく給与
21
+ - **歩合制(Commissioned)**: 基本給 + 売上に応じたコミッション
22
+
23
+ ```plantuml
24
+ @startuml
25
+ title 給与計算システムのドメインモデル
26
+
27
+ class Employee {
28
+ +id: string
29
+ +name: string
30
+ +pay-class: PayClass
31
+ +schedule: Schedule
32
+ +payment-method: PaymentMethod
33
+ }
34
+
35
+ abstract class PayClass {
36
+ +calc-pay()
37
+ }
38
+
39
+ class Salaried {
40
+ +salary: number
41
+ +calc-pay(): salary
42
+ }
43
+
44
+ class Hourly {
45
+ +hourly-rate: number
46
+ +calc-pay(): hours * rate
47
+ }
48
+
49
+ class Commissioned {
50
+ +base-pay: number
51
+ +commission-rate: number
52
+ +calc-pay(): base + sales * rate
53
+ }
54
+
55
+ enum Schedule {
56
+ MONTHLY
57
+ WEEKLY
58
+ BIWEEKLY
59
+ }
60
+
61
+ enum PaymentMethod {
62
+ HOLD
63
+ DIRECT_DEPOSIT
64
+ MAIL
65
+ }
66
+
67
+ Employee --> PayClass
68
+ Employee --> Schedule
69
+ Employee --> PaymentMethod
70
+ Salaried --|> PayClass
71
+ Hourly --|> PayClass
72
+ Commissioned --|> PayClass
73
+ @enduml
74
+ ```
75
+
76
+ ## 2. Clojure Spec による仕様定義
77
+
78
+ ### 従業員の仕様
79
+
80
+ ```clojure
81
+ (ns payroll.employee
82
+ (:require [clojure.spec.alpha :as s]))
83
+
84
+ ;; 基本属性
85
+ (s/def ::id string?)
86
+ (s/def ::name string?)
87
+ (s/def ::address string?)
88
+
89
+ ;; 給与分類
90
+ (s/def ::salary number?)
91
+ (s/def ::hourly-rate number?)
92
+ (s/def ::base-pay number?)
93
+ (s/def ::commission-rate number?)
94
+
95
+ (s/def ::pay-class
96
+ (s/or :salaried (s/tuple #{:salaried} ::salary)
97
+ :hourly (s/tuple #{:hourly} ::hourly-rate)
98
+ :commissioned (s/tuple #{:commissioned} ::base-pay ::commission-rate)))
99
+
100
+ ;; 支払いスケジュール
101
+ (s/def ::schedule #{:monthly :weekly :biweekly})
102
+
103
+ ;; 支払い方法
104
+ (s/def ::payment-method #{:hold :direct-deposit :mail})
105
+
106
+ ;; 従業員
107
+ (s/def ::employee
108
+ (s/keys :req [::id ::name ::pay-class ::schedule ::payment-method]
109
+ :opt [::address]))
110
+ ```
111
+
112
+ ### コンストラクタ
113
+
114
+ ```clojure
115
+ (defn make-salaried-employee
116
+ "月給制従業員を作成"
117
+ [id name salary]
118
+ {::id id
119
+ ::name name
120
+ ::pay-class [:salaried salary]
121
+ ::schedule :monthly
122
+ ::payment-method :hold})
123
+
124
+ (defn make-hourly-employee
125
+ "時給制従業員を作成"
126
+ [id name hourly-rate]
127
+ {::id id
128
+ ::name name
129
+ ::pay-class [:hourly hourly-rate]
130
+ ::schedule :weekly
131
+ ::payment-method :hold})
132
+
133
+ (defn make-commissioned-employee
134
+ "歩合制従業員を作成"
135
+ [id name base-pay commission-rate]
136
+ {::id id
137
+ ::name name
138
+ ::pay-class [:commissioned base-pay commission-rate]
139
+ ::schedule :biweekly
140
+ ::payment-method :hold})
141
+ ```
142
+
143
+ ## 3. マルチメソッドによる給与計算
144
+
145
+ ### 給与計算のディスパッチ
146
+
147
+ ```clojure
148
+ (ns payroll.classification
149
+ (:require [payroll.employee :as emp]))
150
+
151
+ (defmulti calc-pay
152
+ "給与を計算する
153
+ 給与タイプに応じて異なる計算ロジックを適用"
154
+ (fn [employee _context] (emp/get-pay-type employee)))
155
+ ```
156
+
157
+ ### 月給制
158
+
159
+ ```clojure
160
+ (defmethod calc-pay :salaried
161
+ [employee _context]
162
+ (let [[_ salary] (emp/get-pay-class employee)]
163
+ salary))
164
+ ```
165
+
166
+ ### 時給制
167
+
168
+ ```clojure
169
+ (defmethod calc-pay :hourly
170
+ [employee context]
171
+ (let [[_ hourly-rate] (emp/get-pay-class employee)
172
+ time-cards (get-in context [:time-cards (emp/get-id employee)] [])
173
+ hours (map second time-cards)
174
+ total-hours (reduce + 0 hours)
175
+ ;; 週40時間を超える分は1.5倍
176
+ regular-hours (min total-hours 40)
177
+ overtime-hours (max 0 (- total-hours 40))]
178
+ (+ (* regular-hours hourly-rate)
179
+ (* overtime-hours hourly-rate 1.5))))
180
+ ```
181
+
182
+ ### 歩合制
183
+
184
+ ```clojure
185
+ (defmethod calc-pay :commissioned
186
+ [employee context]
187
+ (let [[_ base-pay commission-rate] (emp/get-pay-class employee)
188
+ sales-receipts (get-in context [:sales-receipts (emp/get-id employee)] [])
189
+ total-sales (reduce + 0 (map second sales-receipts))]
190
+ (+ base-pay (* total-sales commission-rate))))
191
+ ```
192
+
193
+ ```plantuml
194
+ @startuml
195
+ title マルチメソッドによる給与計算
196
+
197
+ participant "calc-pay" as calc
198
+ participant "dispatch" as disp
199
+ participant ":salaried" as sal
200
+ participant ":hourly" as hour
201
+ participant ":commissioned" as comm
202
+
203
+ calc -> disp : get-pay-type(employee)
204
+
205
+ alt 月給制
206
+ disp -> sal : calc-pay
207
+ sal --> calc : salary
208
+ else 時給制
209
+ disp -> hour : calc-pay
210
+ hour --> calc : hours * rate + overtime * 1.5
211
+ else 歩合制
212
+ disp -> comm : calc-pay
213
+ comm --> calc : base + sales * rate
214
+ end
215
+ @enduml
216
+ ```
217
+
218
+ ## 4. 支払いスケジュール
219
+
220
+ ### スケジュール判定
221
+
222
+ ```clojure
223
+ (ns payroll.schedule
224
+ (:require [payroll.employee :as emp]))
225
+
226
+ (defmulti is-pay-day?
227
+ "指定日が支払日かどうかを判定"
228
+ (fn [employee _date] (emp/get-schedule employee)))
229
+
230
+ ;; 月次(月末)
231
+ (defmethod is-pay-day? :monthly
232
+ [_employee date]
233
+ (= (:day date) (last-day-of-month date)))
234
+
235
+ ;; 週次(金曜日)
236
+ (defmethod is-pay-day? :weekly
237
+ [_employee date]
238
+ (= (:day-of-week date) :friday))
239
+
240
+ ;; 隔週(隔週の金曜日)
241
+ (defmethod is-pay-day? :biweekly
242
+ [_employee date]
243
+ (and (= (:day-of-week date) :friday)
244
+ (:is-pay-week date)))
245
+ ```
246
+
247
+ ## 5. 支払い処理
248
+
249
+ ### 支払い方法によるディスパッチ
250
+
251
+ ```clojure
252
+ (ns payroll.payroll
253
+ (:require [payroll.employee :as emp]
254
+ [payroll.classification :as class]
255
+ [payroll.schedule :as sched]))
256
+
257
+ (defmulti process-payment
258
+ "支払いを処理"
259
+ (fn [employee _amount] (emp/get-payment-method employee)))
260
+
261
+ (defmethod process-payment :hold
262
+ [employee amount]
263
+ {:type :hold
264
+ :employee-id (emp/get-id employee)
265
+ :amount amount
266
+ :message "支払いを保留"})
267
+
268
+ (defmethod process-payment :direct-deposit
269
+ [employee amount]
270
+ {:type :direct-deposit
271
+ :employee-id (emp/get-id employee)
272
+ :amount amount
273
+ :message "口座に振り込み"})
274
+
275
+ (defmethod process-payment :mail
276
+ [employee amount]
277
+ {:type :mail
278
+ :employee-id (emp/get-id employee)
279
+ :amount amount
280
+ :message "小切手を郵送"})
281
+ ```
282
+
283
+ ## 6. 給与支払いの実行
284
+
285
+ ```clojure
286
+ (defn run-payroll
287
+ "給与支払いを実行
288
+ 支払日に該当する従業員にのみ支払いを行う"
289
+ [employees context date]
290
+ (let [payable-employees (filter #(sched/is-pay-day? % date) employees)]
291
+ (for [emp payable-employees
292
+ :let [pay (class/calc-pay emp context)]]
293
+ (process-payment emp pay))))
294
+ ```
295
+
296
+ ```plantuml
297
+ @startuml
298
+ title 給与支払いフロー
299
+
300
+ start
301
+ :従業員リストを取得;
302
+
303
+ :支払日の従業員をフィルタ;
304
+ note right: is-pay-day? でチェック
305
+
306
+ while (支払対象の従業員がある?) is (yes)
307
+ :給与を計算;
308
+ note right: calc-pay で計算
309
+
310
+ :支払いを処理;
311
+ note right: process-payment で
312
+ 支払い方法に応じた処理
313
+
314
+ endwhile (no)
315
+
316
+ :支払い結果を返す;
317
+ stop
318
+ @enduml
319
+ ```
320
+
321
+ ## 7. 使用例
322
+
323
+ ```clojure
324
+ (require '[payroll.employee :as emp])
325
+ (require '[payroll.classification :as class])
326
+ (require '[payroll.schedule :as sched])
327
+ (require '[payroll.payroll :as payroll])
328
+
329
+ ;; 従業員の作成
330
+ (def salaried-emp
331
+ (emp/make-salaried-employee "E001" "田中太郎" 500000))
332
+
333
+ (def hourly-emp
334
+ (emp/make-hourly-employee "E002" "佐藤花子" 1500))
335
+
336
+ (def commissioned-emp
337
+ (emp/make-commissioned-employee "E003" "鈴木一郎" 200000 0.1))
338
+
339
+ ;; コンテキストの作成(タイムカード、売上データ)
340
+ (def ctx
341
+ (-> (class/make-context)
342
+ (class/add-time-card "E002" "2024-01-15" 8)
343
+ (class/add-time-card "E002" "2024-01-16" 10)
344
+ (class/add-sales-receipt "E003" "2024-01-15" 100000)
345
+ (class/add-sales-receipt "E003" "2024-01-16" 50000)))
346
+
347
+ ;; 給与計算
348
+ (class/calc-pay salaried-emp ctx) ;; => 500000
349
+ (class/calc-pay hourly-emp ctx) ;; => 27000.0 (18時間 * 1500)
350
+ (class/calc-pay commissioned-emp ctx) ;; => 215000.0 (200000 + 15000)
351
+ ```
352
+
353
+ ## 8. 関数型アプローチの利点
354
+
355
+ ### 1. テスト容易性
356
+
357
+ 純粋関数であるため、テストが簡単です。
358
+
359
+ ```clojure
360
+ (describe "給与計算 - 時給制"
361
+ (it "残業時間は1.5倍で計算"
362
+ (let [e (emp/make-hourly-employee "E002" "佐藤" 1000)
363
+ ctx (class/add-time-card {} "E002" "2024-01-15" 45)]
364
+ ;; 40 * 1000 + 5 * 1000 * 1.5 = 47500
365
+ (should= 47500.0 (class/calc-pay e ctx)))))
366
+ ```
367
+
368
+ ### 2. 拡張容易性
369
+
370
+ 新しい給与タイプの追加は、新しいメソッドを定義するだけです。
371
+
372
+ ```clojure
373
+ ;; 新しい給与タイプ: 契約制
374
+ (defmethod calc-pay :contract
375
+ [employee context]
376
+ (let [[_ contract-amount] (emp/get-pay-class employee)]
377
+ contract-amount))
378
+ ```
379
+
380
+ ### 3. 関心の分離
381
+
382
+ - **employee**: データ構造とアクセサ
383
+ - **classification**: 給与計算ロジック
384
+ - **schedule**: 支払日判定
385
+ - **payroll**: 統合処理
386
+
387
+ ## まとめ
388
+
389
+ 本章では、給与計算システムを通じて以下を学びました:
390
+
391
+ 1. **Clojure Spec**: データ仕様の定義
392
+ 2. **マルチメソッド**: 給与タイプによるディスパッチ
393
+ 3. **関心の分離**: モジュール化された設計
394
+ 4. **純粋関数**: テスト容易な実装
395
+
396
+ ## 参考コード
397
+
398
+ 本章のコード例は以下のファイルで確認できます:
399
+
400
+ - ソースコード: `apps/clojure/part6/src/payroll/`
401
+ - テストコード: `apps/clojure/part6/spec/payroll/`