@k2works/claude-code-booster 3.5.0 → 3.6.1
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.
- package/LICENSE +21 -21
- package/README.md +42 -42
- package/bin/claude-code-booster +90 -90
- package/lib/assets/.claude/README.md +239 -239
- package/lib/assets/.claude/scripts/generate-inception-deck.mjs +911 -911
- package/lib/assets/.claude/settings.json +11 -11
- package/lib/assets/.claude/skills/ai-agent-guidelines/SKILL.md +111 -111
- package/lib/assets/.claude/skills/analyzing-architecture/SKILL.md +83 -83
- package/lib/assets/.claude/skills/analyzing-business/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-data-model/SKILL.md +77 -77
- package/lib/assets/.claude/skills/analyzing-domain-model/SKILL.md +117 -88
- package/lib/assets/.claude/skills/analyzing-inception-deck/SKILL.md +84 -84
- package/lib/assets/.claude/skills/analyzing-non-functional/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-operation/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-requirements/SKILL.md +91 -91
- package/lib/assets/.claude/skills/analyzing-tech-stack/SKILL.md +101 -101
- package/lib/assets/.claude/skills/analyzing-test-strategy/SKILL.md +89 -89
- package/lib/assets/.claude/skills/analyzing-ui-design/SKILL.md +80 -80
- package/lib/assets/.claude/skills/analyzing-usecases/SKILL.md +72 -72
- package/lib/assets/.claude/skills/creating-adr/SKILL.md +113 -113
- package/lib/assets/.claude/skills/developing-backend/SKILL.md +100 -100
- package/lib/assets/.claude/skills/developing-frontend/SKILL.md +93 -93
- package/lib/assets/.claude/skills/developing-release/SKILL.md +120 -120
- package/lib/assets/.claude/skills/generating-slides/SKILL.md +94 -94
- package/lib/assets/.claude/skills/git-commit/SKILL.md +81 -81
- package/lib/assets/.claude/skills/killing-processes/SKILL.md +44 -44
- package/lib/assets/.claude/skills/operating-backup/SKILL.md +59 -59
- package/lib/assets/.claude/skills/operating-cicd/SKILL.md +54 -54
- package/lib/assets/.claude/skills/operating-deploy/SKILL.md +67 -67
- package/lib/assets/.claude/skills/operating-docs/SKILL.md +219 -219
- package/lib/assets/.claude/skills/operating-provision/SKILL.md +77 -77
- package/lib/assets/.claude/skills/operating-setup/SKILL.md +63 -63
- package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +104 -104
- package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +162 -161
- package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +158 -158
- package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +144 -144
- package/lib/assets/.claude/skills/planning-releases/SKILL.md +119 -119
- package/lib/assets/.claude/skills/syncing-github-project/SKILL.md +151 -151
- package/lib/assets/.claude/skills/tracking-progress/SKILL.md +91 -91
- package/lib/assets/.claude/skills/validating-iteration-plan/SKILL.md +215 -215
- package/lib/assets/.devcontainer/devcontainer.json +34 -34
- package/lib/assets/.env.example +17 -17
- package/lib/assets/.gitattributes +4 -4
- package/lib/assets/.github/workflows/docker-publish.yml +77 -77
- package/lib/assets/.github/workflows/mkdocs.yml +39 -39
- package/lib/assets/AGENTS.md +94 -94
- package/lib/assets/CLAUDE.md +183 -183
- package/lib/assets/README.md +254 -254
- package/lib/assets/docker-compose.yml +33 -33
- package/lib/assets/docs/adr/index.md +10 -10
- package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -519
- package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -537
- package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -320
- package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -498
- package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -322
- package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -365
- package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -156
- package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -178
- package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -312
- package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -337
- package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -388
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -380
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -352
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -529
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -399
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -485
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -566
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -462
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -401
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -739
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +518 -518
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +532 -532
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +241 -241
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -374
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -375
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -195
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -268
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -164
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -168
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -269
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -148
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -176
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -604
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -729
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -420
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -466
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -523
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -340
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +248 -248
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -452
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -495
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -416
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -687
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -442
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -427
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -428
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -309
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -596
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +355 -355
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +414 -414
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -367
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -362
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -257
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -283
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -326
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +177 -177
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -219
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -244
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -438
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -469
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -174
- package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -90
- package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -463
- package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -425
- package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -247
- package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -841
- package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -331
- package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -356
- package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -361
- package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -392
- package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -297
- package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -315
- package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -311
- package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -349
- package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +243 -243
- package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +328 -328
- package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -348
- package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -357
- package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -364
- package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -515
- package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -557
- package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -327
- package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -517
- package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -441
- package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -407
- package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -398
- package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -476
- package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +391 -391
- package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -342
- package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -730
- package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -624
- package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -512
- package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +433 -433
- package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +688 -688
- package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +243 -243
- package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -162
- package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -135
- package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -299
- package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -241
- package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -131
- package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -127
- package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -114
- package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -138
- package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -65
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -232
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -256
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -195
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -214
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -249
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -174
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -192
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -95
- package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -109
- package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -96
- package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -108
- package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -178
- package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -35
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -246
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -218
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -179
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -267
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -222
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -189
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -215
- package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -213
- package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -302
- package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -339
- package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -394
- package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -422
- package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -400
- package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -226
- package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -296
- package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -411
- package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -337
- package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -257
- package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -313
- package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -309
- package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -412
- package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -390
- package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -461
- package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -434
- package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -392
- package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -631
- package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -49
- package/lib/assets/docs/article/getting-start-tdd/index.md +93 -93
- package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -375
- package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -349
- package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -445
- package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +409 -409
- package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -330
- package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +290 -290
- package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -69
- package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -234
- package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -261
- package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -185
- package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -115
- package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -382
- package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -626
- package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -393
- package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -310
- package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -188
- package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -167
- package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -205
- package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -61
- package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -262
- package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -169
- package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -314
- package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -235
- package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -327
- package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -322
- package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -285
- package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -207
- package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -295
- package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -56
- package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -259
- package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -200
- package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -141
- package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -410
- package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -321
- package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -372
- package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -453
- package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -460
- package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -266
- package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -308
- package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -84
- package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -201
- package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -247
- package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -274
- package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -208
- package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -172
- package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -122
- package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -116
- package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -126
- package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -55
- package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -231
- package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -238
- package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -228
- package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -287
- package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -329
- package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +237 -237
- package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -398
- package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -264
- package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -164
- package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -105
- package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -111
- package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -107
- package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -99
- package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -123
- package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -186
- package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -139
- package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -106
- package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -75
- package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -404
- package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -554
- package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -469
- package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -520
- package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -420
- package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -510
- package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -435
- package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -465
- package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -377
- package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -116
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -122
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -89
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -100
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -97
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -61
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -84
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -92
- package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -80
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -103
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -104
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -121
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -107
- package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -248
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -91
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -106
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -95
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -111
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/index.md +66 -66
- package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -102
- package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -308
- package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -334
- package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -221
- package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -213
- package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -313
- package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -239
- package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -418
- package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -227
- package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -299
- package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -315
- package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -297
- package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -314
- package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -360
- package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -270
- package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -126
- package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -175
- package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -158
- package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -133
- package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -155
- package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -78
- package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -119
- package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -83
- package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -131
- package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -129
- package/lib/assets/docs/article/grokkingfp/all/index.md +368 -368
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -530
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -923
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1128 -1128
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -1104
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -1026
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +785 -785
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -871
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -972
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -926
- package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -870
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -715
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -626
- package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +712 -712
- package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -276
- package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -667
- package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -643
- package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -620
- package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -697
- package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -751
- package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -721
- package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -246
- package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -811
- package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -971
- package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -981
- package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -949
- package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -947
- package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -739
- package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -203
- package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +712 -712
- package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -838
- package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -985
- package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -974
- package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1286 -1286
- package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1049 -1049
- package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -210
- package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -714
- package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -961
- package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -972
- package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -832
- package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -911
- package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +922 -922
- package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -234
- package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -591
- package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -866
- package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -915
- package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +878 -878
- package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -845
- package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +844 -844
- package/lib/assets/docs/article/grokkingfp/index.md +143 -143
- package/lib/assets/docs/article/grokkingfp/java/index.md +211 -211
- package/lib/assets/docs/article/grokkingfp/java/part-1.md +648 -648
- package/lib/assets/docs/article/grokkingfp/java/part-2.md +675 -675
- package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -672
- package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -771
- package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -959
- package/lib/assets/docs/article/grokkingfp/java/part-6.md +1328 -1328
- package/lib/assets/docs/article/grokkingfp/python/index.md +258 -258
- package/lib/assets/docs/article/grokkingfp/python/part-1.md +443 -443
- package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -958
- package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -1004
- package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -765
- package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -747
- package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -861
- package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -330
- package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +755 -755
- package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -938
- package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -946
- package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -921
- package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -908
- package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1412 -1412
- package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -242
- package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -634
- package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -1060
- package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -994
- package/lib/assets/docs/article/grokkingfp/rust/part-4.md +573 -573
- package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -705
- package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -508
- package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -171
- package/lib/assets/docs/article/grokkingfp/scala/part-1.md +543 -543
- package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -946
- package/lib/assets/docs/article/grokkingfp/scala/part-3.md +919 -919
- package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -742
- package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -722
- package/lib/assets/docs/article/grokkingfp/scala/part-6.md +867 -867
- package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -273
- package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +561 -561
- package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -1129
- package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -842
- package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1087 -1087
- package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -717
- package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +982 -982
- package/lib/assets/docs/article/practical-database-design/index.md +121 -121
- package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +288 -288
- package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +518 -518
- package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +557 -557
- package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +924 -924
- package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +1627 -1627
- package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +2716 -2716
- package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +2082 -2082
- package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +2105 -2105
- package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +2031 -2031
- package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +1387 -1387
- package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +1677 -1677
- package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +1417 -1417
- package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +1434 -1434
- package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +667 -667
- package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +1625 -1625
- package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +1915 -1915
- package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +1708 -1708
- package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +2095 -2095
- package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +1123 -1123
- package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +1031 -1031
- package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +1382 -1382
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +991 -991
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +1300 -1300
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +1166 -1166
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +1584 -1584
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +1183 -1183
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +1016 -1016
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +1753 -1753
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +1447 -1447
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +1878 -1878
- package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +965 -965
- package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +2069 -2069
- package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +2439 -2439
- package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +3661 -3661
- package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +2916 -2916
- package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +3105 -3105
- package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +2697 -2697
- package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +2544 -2544
- package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +2180 -2180
- package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +1192 -1192
- package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +2101 -2101
- package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +1032 -1032
- package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +1609 -1609
- package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +1453 -1453
- package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +1292 -1292
- package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +1470 -1470
- package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +1698 -1698
- package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +2334 -2334
- package/lib/assets/docs/article/practical-database-design/study/study2-1.md +1693 -1693
- package/lib/assets/docs/article/practical-database-design/study/study2-2.md +1347 -1347
- package/lib/assets/docs/article/practical-database-design/study/study2-3.md +2044 -2044
- package/lib/assets/docs/article/practical-database-design/study/study2-4.md +2229 -2229
- package/lib/assets/docs/article/practical-database-design/study/study2-5.md +2418 -2418
- package/lib/assets/docs/article/practical-database-design/study/study3-1.md +2205 -2205
- package/lib/assets/docs/article/practical-database-design/study/study3-2.md +2221 -2221
- package/lib/assets/docs/article/practical-database-design/study/study3-3.md +2253 -2253
- package/lib/assets/docs/article/practical-database-design/study/study3-4.md +2106 -2106
- package/lib/assets/docs/article/practical-database-design/study/study3-5.md +2507 -2507
- package/lib/assets/docs/article/practical-database-design/study/study4-1.md +2587 -2587
- package/lib/assets/docs/article/practical-database-design/study/study4-2.md +2075 -2075
- package/lib/assets/docs/article/practical-database-design/study/study4-3.md +1805 -1805
- package/lib/assets/docs/article/practical-database-design/study/study4-4.md +1895 -1895
- package/lib/assets/docs/article/practical-database-design/study/study4-5.md +2878 -2878
- package/lib/assets/docs/assets/css/extra.css +29 -29
- package/lib/assets/docs/assets/js/extra.js +44 -44
- package/lib/assets/docs/development/index.md +39 -39
- package/lib/assets/docs/operation/index.md +11 -11
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +532 -532
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +341 -341
- package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +581 -580
- package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +642 -642
- package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +465 -465
- package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +450 -450
- package/lib/assets/docs/reference/images/Ansoff.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandBasicStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandCategorization.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandRecurutementStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandValue.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BusinessActivitiy.svg +3 -3
- package/lib/assets/docs/reference/images/HRM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/MarketingStructure.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/OrganizationElemnts.svg +3 -3
- package/lib/assets/docs/reference/images/PPM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/PositioningMap.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductLayer.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductMix.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/SWOT.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/TargetMarket.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ThreeGenericStrategies.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/VRIO.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ValueChain.drawio.svg +3 -3
- package/lib/assets/docs/reference/index.md +52 -52
- package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +250 -242
- package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +2216 -2216
- package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +1878 -1878
- package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +550 -544
- package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +705 -705
- package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +1313 -1313
- package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +311 -311
- package/lib/assets/docs/reference//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +599 -599
- package/lib/assets/docs/reference//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +528 -528
- package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +689 -682
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +461 -461
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211.md +580 -560
- package/lib/assets/docs/reference//343/203/255/343/202/270/343/202/253/343/203/253/343/202/267/343/203/263/343/202/255/343/203/263/343/202/260.md +1367 -1367
- package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +2637 -2636
- package/lib/assets/docs/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +665 -663
- package/lib/assets/docs/reference//350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1248 -1248
- package/lib/assets/docs/reference//350/250/200/350/252/236/345/210/245/351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +28 -0
- package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +1482 -1482
- package/lib/assets/docs/reference//351/201/213/347/224/250/343/202/271/343/202/257/343/203/252/343/203/227/343/203/210/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +421 -421
- package/lib/assets/docs/reference//351/201/213/347/224/250/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +392 -392
- package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +299 -299
- package/lib/assets/docs/reference//351/235/236/346/251/237/350/203/275/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1236 -1236
- package/lib/assets/docs/review/index.md +5 -5
- package/lib/assets/docs/strategy/index.md +1 -1
- package/lib/assets/docs/template/ADR.md +30 -30
- package/lib/assets/docs/template/AWS/343/202/271/343/203/206/343/203/274/343/202/270/343/203/263/343/202/260/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +1366 -1366
- package/lib/assets/docs/template/AWS/343/203/227/343/203/255/343/203/200/343/202/257/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +634 -634
- package/lib/assets/docs/template/README.md +50 -50
- package/lib/assets/docs/template/index.md +23 -23
- package/lib/assets/docs/template//343/201/276/343/201/232/343/201/223/343/202/214/343/202/222/350/252/255/343/202/202/343/201/206/343/203/252/343/202/271/343/203/210.md +12 -12
- package/lib/assets/docs/template//343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +547 -547
- package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +58 -58
- package/lib/assets/docs/template//343/202/244/343/203/263/343/202/273/343/203/227/343/202/267/343/203/247/343/203/263/343/203/207/343/203/203/343/202/255.md +13 -13
- package/lib/assets/docs/template//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243.md +379 -379
- package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +573 -573
- package/lib/assets/docs/template//345/256/214/345/205/250/345/275/242/345/274/217/343/201/256/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +69 -68
- package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +669 -669
- package/lib/assets/docs/template//350/250/255/350/250/210.md +173 -173
- package/lib/assets/docs/template//351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +688 -688
- package/lib/assets/gulpfile.js +25 -25
- package/lib/assets/mkdocs.yml +136 -135
- package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
- package/lib/assets/ops/scripts/journal.js +180 -180
- package/lib/assets/ops/scripts/mkdocs.js +82 -82
- package/lib/assets/ops/scripts/release.js +431 -431
- package/lib/assets/ops/scripts/sonar_local.js +726 -726
- package/lib/assets/ops/scripts/ssh.js +190 -190
- package/lib/assets/ops/scripts/vault.js +299 -299
- package/lib/assets/package-lock.json +1653 -1653
- package/lib/assets/package.json +40 -40
- package/lib/gulpfile.js +37 -37
- package/package.json +41 -41
- package/lib/assets/.claude/agent-memory/xp-programmer/MEMORY.md +0 -6
- package/lib/assets/.claude/agent-memory/xp-programmer/project_cargo_tracker.md +0 -11
- package/lib/assets/.claude/agent-memory/xp-programmer/project_ddd_patterns.md +0 -27
- package/lib/assets/.claude/agent-memory/xp-programmer/project_us07_route_assignment.md +0 -19
|
@@ -1,395 +1,395 @@
|
|
|
1
|
-
# 第7章: Composite パターン
|
|
2
|
-
|
|
3
|
-
## はじめに
|
|
4
|
-
|
|
5
|
-
Composite パターンは、オブジェクトをツリー構造で構成し、個々のオブジェクトとオブジェクトの集合を同じように扱うことができるようにするパターンです。このパターンを使用すると、クライアントは個々のオブジェクトとその組み合わせを区別せずに操作できます。
|
|
6
|
-
|
|
7
|
-
本章では、図形(Shape)、スイッチ(Switchable)、ファイルシステム、メニュー、数式、組織構造など、様々な例を通じて Composite パターンの実装を学びます。
|
|
8
|
-
|
|
9
|
-
## 1. パターンの構造
|
|
10
|
-
|
|
11
|
-
Composite パターンは以下の要素で構成されます:
|
|
12
|
-
|
|
13
|
-
- **Component**: 全てのオブジェクトの共通インターフェース
|
|
14
|
-
- **Leaf**: 子要素を持たない末端オブジェクト
|
|
15
|
-
- **Composite**: 子要素を持つコンテナオブジェクト
|
|
16
|
-
|
|
17
|
-
```plantuml
|
|
18
|
-
@startuml
|
|
19
|
-
skinparam classAttributeIconSize 0
|
|
20
|
-
|
|
21
|
-
abstract class Component {
|
|
22
|
-
+operation(): Result
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
class Leaf {
|
|
26
|
-
+operation()
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
class Composite {
|
|
30
|
-
-children: [Component]
|
|
31
|
-
+add(c: Component)
|
|
32
|
-
+operation()
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
Component <|-- Leaf
|
|
36
|
-
Component <|-- Composite
|
|
37
|
-
Composite o-- Component : children
|
|
38
|
-
@enduml
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## 2. Shape - 図形の Composite パターン
|
|
42
|
-
|
|
43
|
-
### 代数的データ型による実装
|
|
44
|
-
|
|
45
|
-
Haskell では代数的データ型(ADT)を使って Component を表現します:
|
|
46
|
-
|
|
47
|
-
```haskell
|
|
48
|
-
-- | 2D Point
|
|
49
|
-
data Point = Point
|
|
50
|
-
{ pointX :: Double
|
|
51
|
-
, pointY :: Double
|
|
52
|
-
} deriving (Show, Eq)
|
|
53
|
-
|
|
54
|
-
-- | Shape - Composite pattern for geometric shapes
|
|
55
|
-
data Shape
|
|
56
|
-
= Circle Point Double -- ^ Circle with center and radius
|
|
57
|
-
| Square Point Double -- ^ Square with top-left corner and side length
|
|
58
|
-
| Rectangle Point Double Double -- ^ Rectangle with top-left, width, and height
|
|
59
|
-
| CompositeShape [Shape] -- ^ Composite containing multiple shapes
|
|
60
|
-
deriving (Show, Eq)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### 再帰的な操作
|
|
64
|
-
|
|
65
|
-
```haskell
|
|
66
|
-
-- | Translate a shape by (dx, dy)
|
|
67
|
-
translateShape :: Double -> Double -> Shape -> Shape
|
|
68
|
-
translateShape dx dy shape = case shape of
|
|
69
|
-
Circle (Point x y) r -> Circle (Point (x + dx) (y + dy)) r
|
|
70
|
-
Square (Point x y) s -> Square (Point (x + dx) (y + dy)) s
|
|
71
|
-
Rectangle (Point x y) w h -> Rectangle (Point (x + dx) (y + dy)) w h
|
|
72
|
-
CompositeShape shapes -> CompositeShape (map (translateShape dx dy) shapes)
|
|
73
|
-
|
|
74
|
-
-- | Scale a shape by a factor
|
|
75
|
-
scaleShape :: Double -> Shape -> Shape
|
|
76
|
-
scaleShape factor shape = case shape of
|
|
77
|
-
Circle c r -> Circle c (r * factor)
|
|
78
|
-
Square tl s -> Square tl (s * factor)
|
|
79
|
-
Rectangle tl w h -> Rectangle tl (w * factor) (h * factor)
|
|
80
|
-
CompositeShape shapes -> CompositeShape (map (scaleShape factor) shapes)
|
|
81
|
-
|
|
82
|
-
-- | Calculate the area of a shape
|
|
83
|
-
shapeArea :: Shape -> Double
|
|
84
|
-
shapeArea shape = case shape of
|
|
85
|
-
Circle _ r -> pi * r * r
|
|
86
|
-
Square _ s -> s * s
|
|
87
|
-
Rectangle _ w h -> w * h
|
|
88
|
-
CompositeShape shapes -> sum (map shapeArea shapes)
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### 使用例
|
|
92
|
-
|
|
93
|
-
```haskell
|
|
94
|
-
-- 個々の図形を作成
|
|
95
|
-
let circle = Circle (Point 10 10) 5
|
|
96
|
-
let square = Square (Point 0 0) 10
|
|
97
|
-
|
|
98
|
-
-- 複合図形を作成
|
|
99
|
-
let group = addShape square (addShape circle emptyComposite)
|
|
100
|
-
-- CompositeShape [Circle (Point 10 10) 5, Square (Point 0 0) 10]
|
|
101
|
-
|
|
102
|
-
-- 複合図形を移動(全ての子要素が移動する)
|
|
103
|
-
let moved = translateShape 5 5 group
|
|
104
|
-
-- CompositeShape [Circle (Point 15 15) 5, Square (Point 5 5) 10]
|
|
105
|
-
|
|
106
|
-
-- 複合図形を拡大(全ての子要素が拡大する)
|
|
107
|
-
let scaled = scaleShape 2 group
|
|
108
|
-
-- CompositeShape [Circle (Point 10 10) 10, Square (Point 0 0) 20]
|
|
109
|
-
|
|
110
|
-
-- 面積は全ての子要素の合計
|
|
111
|
-
let totalArea = shapeArea group -- pi * 25 + 100
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## 3. Switchable - スイッチの Composite パターン
|
|
115
|
-
|
|
116
|
-
```haskell
|
|
117
|
-
-- | Switchable - Composite pattern for switchable devices
|
|
118
|
-
data Switchable
|
|
119
|
-
= Light String Bool -- ^ Light with name and on/off state
|
|
120
|
-
| DimmableLight String Int -- ^ Dimmable light with name and intensity (0-100)
|
|
121
|
-
| Fan String Bool Int -- ^ Fan with name, on/off state, and speed
|
|
122
|
-
| CompositeSwitchable String [Switchable] -- ^ Composite with name and list
|
|
123
|
-
deriving (Show, Eq)
|
|
124
|
-
|
|
125
|
-
-- | Turn on a switchable
|
|
126
|
-
turnOn :: Switchable -> Switchable
|
|
127
|
-
turnOn switchable = case switchable of
|
|
128
|
-
Light name _ -> Light name True
|
|
129
|
-
DimmableLight name _ -> DimmableLight name 100
|
|
130
|
-
Fan name _ speed -> Fan name True (max speed 1)
|
|
131
|
-
CompositeSwitchable name items -> CompositeSwitchable name (map turnOn items)
|
|
132
|
-
|
|
133
|
-
-- | Check if a switchable is on
|
|
134
|
-
isOn :: Switchable -> Bool
|
|
135
|
-
isOn switchable = case switchable of
|
|
136
|
-
Light _ on -> on
|
|
137
|
-
DimmableLight _ intensity -> intensity > 0
|
|
138
|
-
Fan _ on _ -> on
|
|
139
|
-
CompositeSwitchable _ items -> any isOn items
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### 使用例
|
|
143
|
-
|
|
144
|
-
```haskell
|
|
145
|
-
-- 部屋のスイッチグループを作成
|
|
146
|
-
let bedroom = emptySwitchableComposite "Bedroom"
|
|
147
|
-
|> addSwitchable (Light "Ceiling" False)
|
|
148
|
-
|> addSwitchable (DimmableLight "Bedside" 0)
|
|
149
|
-
|
|
150
|
-
let livingRoom = emptySwitchableComposite "LivingRoom"
|
|
151
|
-
|> addSwitchable (Light "Main" False)
|
|
152
|
-
|> addSwitchable (Fan "CeilingFan" False 0)
|
|
153
|
-
|
|
154
|
-
-- 家全体のグループ
|
|
155
|
-
let house = emptySwitchableComposite "House"
|
|
156
|
-
|> addSwitchable bedroom
|
|
157
|
-
|> addSwitchable livingRoom
|
|
158
|
-
|
|
159
|
-
-- 家中の全てのスイッチをオン
|
|
160
|
-
let allOn = turnOn house
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
## 4. FileSystem - ファイルシステムの Composite パターン
|
|
164
|
-
|
|
165
|
-
```haskell
|
|
166
|
-
-- | FileSystemEntry - Composite pattern for file system
|
|
167
|
-
data FileSystemEntry
|
|
168
|
-
= File String Int String -- ^ File with name, size, and extension
|
|
169
|
-
| Directory String [FileSystemEntry] -- ^ Directory with name and children
|
|
170
|
-
deriving (Show, Eq)
|
|
171
|
-
|
|
172
|
-
-- | Get the total size of a file system entry
|
|
173
|
-
fileSize :: FileSystemEntry -> Int
|
|
174
|
-
fileSize entry = case entry of
|
|
175
|
-
File _ size _ -> size
|
|
176
|
-
Directory _ children -> sum (map fileSize children)
|
|
177
|
-
|
|
178
|
-
-- | Find files by extension
|
|
179
|
-
findByExtension :: String -> FileSystemEntry -> [FileSystemEntry]
|
|
180
|
-
findByExtension ext entry = case entry of
|
|
181
|
-
File _ _ fileExt | fileExt == ext -> [entry]
|
|
182
|
-
File {} -> []
|
|
183
|
-
Directory _ children -> concatMap (findByExtension ext) children
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### 使用例
|
|
187
|
-
|
|
188
|
-
```haskell
|
|
189
|
-
-- ファイルシステム構造を構築
|
|
190
|
-
let readme = File "readme.txt" 1024 ".txt"
|
|
191
|
-
let config = File "config.json" 512 ".json"
|
|
192
|
-
let src = Directory "src"
|
|
193
|
-
[ File "main.fs" 2048 ".fs"
|
|
194
|
-
, File "util.fs" 1024 ".fs"
|
|
195
|
-
]
|
|
196
|
-
let root = Directory "project" [readme, config, src]
|
|
197
|
-
|
|
198
|
-
-- 総サイズを取得
|
|
199
|
-
let totalSize = fileSize root -- 4608
|
|
200
|
-
|
|
201
|
-
-- .fs ファイルを検索
|
|
202
|
-
let fsFiles = findByExtension ".fs" root -- 2 files
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
## 5. MenuItem - メニューの Composite パターン
|
|
206
|
-
|
|
207
|
-
```haskell
|
|
208
|
-
-- | MenuItem - Composite pattern for menu items
|
|
209
|
-
data MenuItem
|
|
210
|
-
= Item String Double String -- ^ Item with name, price, and category
|
|
211
|
-
| SetMenu String [MenuItem] Double -- ^ Set menu with name, items, and discount rate
|
|
212
|
-
deriving (Show, Eq)
|
|
213
|
-
|
|
214
|
-
-- | Calculate the price of a menu item
|
|
215
|
-
menuPrice :: MenuItem -> Double
|
|
216
|
-
menuPrice item = case item of
|
|
217
|
-
Item _ price _ -> price
|
|
218
|
-
SetMenu _ items discountRate ->
|
|
219
|
-
let totalPrice = sum (map menuPrice items)
|
|
220
|
-
in totalPrice * (1 - discountRate)
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
### 使用例
|
|
224
|
-
|
|
225
|
-
```haskell
|
|
226
|
-
-- 単品メニュー
|
|
227
|
-
let burger = Item "Hamburger" 500 "Main"
|
|
228
|
-
let fries = Item "Fries" 200 "Side"
|
|
229
|
-
let drink = Item "Cola" 150 "Drink"
|
|
230
|
-
|
|
231
|
-
-- セットメニュー(10%割引)
|
|
232
|
-
let lunchSet = SetMenu "Lunch Set" [burger, fries, drink] 0.1
|
|
233
|
-
|
|
234
|
-
-- セット価格 = (500 + 200 + 150) * 0.9 = 765
|
|
235
|
-
let setPrice = menuPrice lunchSet
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
## 6. Expression - 数式の Composite パターン
|
|
239
|
-
|
|
240
|
-
```haskell
|
|
241
|
-
-- | Expression - Composite pattern for mathematical expressions
|
|
242
|
-
data Expr
|
|
243
|
-
= Number Double -- ^ Numeric literal
|
|
244
|
-
| Variable String (Maybe Double) -- ^ Variable with optional bound value
|
|
245
|
-
| Add Expr Expr -- ^ Addition
|
|
246
|
-
| Subtract Expr Expr -- ^ Subtraction
|
|
247
|
-
| Multiply Expr Expr -- ^ Multiplication
|
|
248
|
-
| Divide Expr Expr -- ^ Division
|
|
249
|
-
| Negate Expr -- ^ Negation
|
|
250
|
-
deriving (Show, Eq)
|
|
251
|
-
|
|
252
|
-
-- | Evaluate an expression
|
|
253
|
-
evaluate :: Expr -> Maybe Double
|
|
254
|
-
evaluate expr = case expr of
|
|
255
|
-
Number n -> Just n
|
|
256
|
-
Variable _ (Just v) -> Just v
|
|
257
|
-
Variable _ Nothing -> Nothing -- Unbound variable
|
|
258
|
-
Add l r -> (+) <$> evaluate l <*> evaluate r
|
|
259
|
-
Subtract l r -> (-) <$> evaluate l <*> evaluate r
|
|
260
|
-
Multiply l r -> (*) <$> evaluate l <*> evaluate r
|
|
261
|
-
Divide l r -> do
|
|
262
|
-
lv <- evaluate l
|
|
263
|
-
rv <- evaluate r
|
|
264
|
-
if rv == 0 then Nothing else Just (lv / rv)
|
|
265
|
-
Negate e -> negate <$> evaluate e
|
|
266
|
-
|
|
267
|
-
-- | Simplify an expression
|
|
268
|
-
simplify :: Expr -> Expr
|
|
269
|
-
simplify expr = case expr of
|
|
270
|
-
Add l r -> case (simplify l, simplify r) of
|
|
271
|
-
(Number 0, r') -> r'
|
|
272
|
-
(l', Number 0) -> l'
|
|
273
|
-
(Number a, Number b) -> Number (a + b)
|
|
274
|
-
(l', r') -> Add l' r'
|
|
275
|
-
-- ... other cases
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### 使用例
|
|
279
|
-
|
|
280
|
-
```haskell
|
|
281
|
-
-- (2 + 3) * 4 = 20
|
|
282
|
-
let expr = Multiply (Add (Number 2) (Number 3)) (Number 4)
|
|
283
|
-
let result = evaluate expr -- Just 20
|
|
284
|
-
|
|
285
|
-
-- 変数を含む式
|
|
286
|
-
let exprWithVars = Add (Variable "x" Nothing) (Variable "y" Nothing)
|
|
287
|
-
let bound = bindVars [("x", 10), ("y", 20)] exprWithVars
|
|
288
|
-
let value = evaluate bound -- Just 30
|
|
289
|
-
|
|
290
|
-
-- 式の簡略化
|
|
291
|
-
let simplified = simplify (Add (Variable "x" Nothing) (Number 0))
|
|
292
|
-
-- => Variable "x" Nothing
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
## 7. Organization - 組織構造の Composite パターン
|
|
296
|
-
|
|
297
|
-
```haskell
|
|
298
|
-
-- | OrganizationMember - Composite pattern for organizational structure
|
|
299
|
-
data OrganizationMember
|
|
300
|
-
= Employee String Double String -- ^ Employee with name, salary, and role
|
|
301
|
-
| Department String (Maybe String) [OrganizationMember]
|
|
302
|
-
-- ^ Department with name, manager, and members
|
|
303
|
-
deriving (Show, Eq)
|
|
304
|
-
|
|
305
|
-
-- | Calculate the total salary
|
|
306
|
-
totalSalary :: OrganizationMember -> Double
|
|
307
|
-
totalSalary member = case member of
|
|
308
|
-
Employee _ salary _ -> salary
|
|
309
|
-
Department _ _ members -> sum (map totalSalary members)
|
|
310
|
-
|
|
311
|
-
-- | Find employees by role
|
|
312
|
-
findByRole :: String -> OrganizationMember -> [OrganizationMember]
|
|
313
|
-
findByRole role member = case member of
|
|
314
|
-
Employee _ _ r | r == role -> [member]
|
|
315
|
-
Employee {} -> []
|
|
316
|
-
Department _ _ members -> concatMap (findByRole role) members
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
## パターンの利点
|
|
320
|
-
|
|
321
|
-
1. **統一的な操作**: 個々のオブジェクトとグループを同じインターフェースで操作可能
|
|
322
|
-
2. **階層構造**: ネストした構造を自然に表現可能
|
|
323
|
-
3. **拡張性**: 新しい Leaf や Composite を追加しやすい
|
|
324
|
-
4. **再帰的な構造**: Composite は他の Composite を含むことも可能
|
|
325
|
-
|
|
326
|
-
## Haskell での特徴
|
|
327
|
-
|
|
328
|
-
### 代数的データ型による型安全性
|
|
329
|
-
|
|
330
|
-
```haskell
|
|
331
|
-
-- 全てのケースを網羅するパターンマッチ
|
|
332
|
-
shapeArea :: Shape -> Double
|
|
333
|
-
shapeArea shape = case shape of
|
|
334
|
-
Circle _ r -> pi * r * r
|
|
335
|
-
Square _ s -> s * s
|
|
336
|
-
Rectangle _ w h -> w * h
|
|
337
|
-
CompositeShape shapes -> sum (map shapeArea shapes)
|
|
338
|
-
-- 新しいケースを追加すると、コンパイラが警告を出す
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
### 不変性による安全な操作
|
|
342
|
-
|
|
343
|
-
```haskell
|
|
344
|
-
-- 元のオブジェクトは変更されない
|
|
345
|
-
let original = addShape (Circle (Point 0 0) 5) emptyComposite
|
|
346
|
-
let moved = translateShape 10 10 original
|
|
347
|
-
-- original は変更されていない
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### 再帰関数と高階関数
|
|
351
|
-
|
|
352
|
-
```haskell
|
|
353
|
-
-- 再帰的な処理も簡潔に
|
|
354
|
-
let result = emptyComposite
|
|
355
|
-
& addShape circle
|
|
356
|
-
& addShape square
|
|
357
|
-
& translateShape 5 5
|
|
358
|
-
& scaleShape 2
|
|
359
|
-
& shapeArea
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
## Clojure/F# との比較
|
|
363
|
-
|
|
364
|
-
| 概念 | Clojure | F# | Haskell |
|
|
365
|
-
|------|---------|-----|---------|
|
|
366
|
-
| インターフェース | マルチメソッド | 判別共用体 | ADT |
|
|
367
|
-
| Leaf | defmethod | Union case | Constructor |
|
|
368
|
-
| Composite | defmethod + mapv | Union case with list | Constructor with list |
|
|
369
|
-
| 操作の委譲 | mapv | List.map | map |
|
|
370
|
-
| 不変性 | デフォルト | デフォルト | 強制 |
|
|
371
|
-
| 網羅性チェック | なし | 完全チェック | 完全チェック |
|
|
372
|
-
|
|
373
|
-
## まとめ
|
|
374
|
-
|
|
375
|
-
本章では、Composite パターンについて学びました:
|
|
376
|
-
|
|
377
|
-
1. **Shape の例**: 図形の移動と拡大を統一的に操作
|
|
378
|
-
2. **Switchable の例**: 複数のスイッチをグループ化して操作
|
|
379
|
-
3. **FileSystem の例**: ファイルとディレクトリの階層構造
|
|
380
|
-
4. **Menu の例**: 単品とセットメニューの価格計算
|
|
381
|
-
5. **Expression の例**: 数式の評価と簡略化
|
|
382
|
-
6. **Organization の例**: 組織構造の給与計算
|
|
383
|
-
|
|
384
|
-
Composite パターンは、ツリー構造のデータを扱う際に非常に有効なパターンです。Haskell の代数的データ型とパターンマッチを使うことで、型安全で不変なツリー構造を簡潔に実装できます。
|
|
385
|
-
|
|
386
|
-
## 参考コード
|
|
387
|
-
|
|
388
|
-
本章のコード例は以下のファイルで確認できます:
|
|
389
|
-
|
|
390
|
-
- ソースコード: `apps/haskell/part3/src/CompositePattern.hs`
|
|
391
|
-
- テストコード: `apps/haskell/part3/test/CompositePatternSpec.hs`
|
|
392
|
-
|
|
393
|
-
## 次章予告
|
|
394
|
-
|
|
395
|
-
次章では、**Decorator パターン**について学びます。既存の機能に新しい機能を動的に追加する方法を探ります。
|
|
1
|
+
# 第7章: Composite パターン
|
|
2
|
+
|
|
3
|
+
## はじめに
|
|
4
|
+
|
|
5
|
+
Composite パターンは、オブジェクトをツリー構造で構成し、個々のオブジェクトとオブジェクトの集合を同じように扱うことができるようにするパターンです。このパターンを使用すると、クライアントは個々のオブジェクトとその組み合わせを区別せずに操作できます。
|
|
6
|
+
|
|
7
|
+
本章では、図形(Shape)、スイッチ(Switchable)、ファイルシステム、メニュー、数式、組織構造など、様々な例を通じて Composite パターンの実装を学びます。
|
|
8
|
+
|
|
9
|
+
## 1. パターンの構造
|
|
10
|
+
|
|
11
|
+
Composite パターンは以下の要素で構成されます:
|
|
12
|
+
|
|
13
|
+
- **Component**: 全てのオブジェクトの共通インターフェース
|
|
14
|
+
- **Leaf**: 子要素を持たない末端オブジェクト
|
|
15
|
+
- **Composite**: 子要素を持つコンテナオブジェクト
|
|
16
|
+
|
|
17
|
+
```plantuml
|
|
18
|
+
@startuml
|
|
19
|
+
skinparam classAttributeIconSize 0
|
|
20
|
+
|
|
21
|
+
abstract class Component {
|
|
22
|
+
+operation(): Result
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
class Leaf {
|
|
26
|
+
+operation()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
class Composite {
|
|
30
|
+
-children: [Component]
|
|
31
|
+
+add(c: Component)
|
|
32
|
+
+operation()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
Component <|-- Leaf
|
|
36
|
+
Component <|-- Composite
|
|
37
|
+
Composite o-- Component : children
|
|
38
|
+
@enduml
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 2. Shape - 図形の Composite パターン
|
|
42
|
+
|
|
43
|
+
### 代数的データ型による実装
|
|
44
|
+
|
|
45
|
+
Haskell では代数的データ型(ADT)を使って Component を表現します:
|
|
46
|
+
|
|
47
|
+
```haskell
|
|
48
|
+
-- | 2D Point
|
|
49
|
+
data Point = Point
|
|
50
|
+
{ pointX :: Double
|
|
51
|
+
, pointY :: Double
|
|
52
|
+
} deriving (Show, Eq)
|
|
53
|
+
|
|
54
|
+
-- | Shape - Composite pattern for geometric shapes
|
|
55
|
+
data Shape
|
|
56
|
+
= Circle Point Double -- ^ Circle with center and radius
|
|
57
|
+
| Square Point Double -- ^ Square with top-left corner and side length
|
|
58
|
+
| Rectangle Point Double Double -- ^ Rectangle with top-left, width, and height
|
|
59
|
+
| CompositeShape [Shape] -- ^ Composite containing multiple shapes
|
|
60
|
+
deriving (Show, Eq)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 再帰的な操作
|
|
64
|
+
|
|
65
|
+
```haskell
|
|
66
|
+
-- | Translate a shape by (dx, dy)
|
|
67
|
+
translateShape :: Double -> Double -> Shape -> Shape
|
|
68
|
+
translateShape dx dy shape = case shape of
|
|
69
|
+
Circle (Point x y) r -> Circle (Point (x + dx) (y + dy)) r
|
|
70
|
+
Square (Point x y) s -> Square (Point (x + dx) (y + dy)) s
|
|
71
|
+
Rectangle (Point x y) w h -> Rectangle (Point (x + dx) (y + dy)) w h
|
|
72
|
+
CompositeShape shapes -> CompositeShape (map (translateShape dx dy) shapes)
|
|
73
|
+
|
|
74
|
+
-- | Scale a shape by a factor
|
|
75
|
+
scaleShape :: Double -> Shape -> Shape
|
|
76
|
+
scaleShape factor shape = case shape of
|
|
77
|
+
Circle c r -> Circle c (r * factor)
|
|
78
|
+
Square tl s -> Square tl (s * factor)
|
|
79
|
+
Rectangle tl w h -> Rectangle tl (w * factor) (h * factor)
|
|
80
|
+
CompositeShape shapes -> CompositeShape (map (scaleShape factor) shapes)
|
|
81
|
+
|
|
82
|
+
-- | Calculate the area of a shape
|
|
83
|
+
shapeArea :: Shape -> Double
|
|
84
|
+
shapeArea shape = case shape of
|
|
85
|
+
Circle _ r -> pi * r * r
|
|
86
|
+
Square _ s -> s * s
|
|
87
|
+
Rectangle _ w h -> w * h
|
|
88
|
+
CompositeShape shapes -> sum (map shapeArea shapes)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 使用例
|
|
92
|
+
|
|
93
|
+
```haskell
|
|
94
|
+
-- 個々の図形を作成
|
|
95
|
+
let circle = Circle (Point 10 10) 5
|
|
96
|
+
let square = Square (Point 0 0) 10
|
|
97
|
+
|
|
98
|
+
-- 複合図形を作成
|
|
99
|
+
let group = addShape square (addShape circle emptyComposite)
|
|
100
|
+
-- CompositeShape [Circle (Point 10 10) 5, Square (Point 0 0) 10]
|
|
101
|
+
|
|
102
|
+
-- 複合図形を移動(全ての子要素が移動する)
|
|
103
|
+
let moved = translateShape 5 5 group
|
|
104
|
+
-- CompositeShape [Circle (Point 15 15) 5, Square (Point 5 5) 10]
|
|
105
|
+
|
|
106
|
+
-- 複合図形を拡大(全ての子要素が拡大する)
|
|
107
|
+
let scaled = scaleShape 2 group
|
|
108
|
+
-- CompositeShape [Circle (Point 10 10) 10, Square (Point 0 0) 20]
|
|
109
|
+
|
|
110
|
+
-- 面積は全ての子要素の合計
|
|
111
|
+
let totalArea = shapeArea group -- pi * 25 + 100
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 3. Switchable - スイッチの Composite パターン
|
|
115
|
+
|
|
116
|
+
```haskell
|
|
117
|
+
-- | Switchable - Composite pattern for switchable devices
|
|
118
|
+
data Switchable
|
|
119
|
+
= Light String Bool -- ^ Light with name and on/off state
|
|
120
|
+
| DimmableLight String Int -- ^ Dimmable light with name and intensity (0-100)
|
|
121
|
+
| Fan String Bool Int -- ^ Fan with name, on/off state, and speed
|
|
122
|
+
| CompositeSwitchable String [Switchable] -- ^ Composite with name and list
|
|
123
|
+
deriving (Show, Eq)
|
|
124
|
+
|
|
125
|
+
-- | Turn on a switchable
|
|
126
|
+
turnOn :: Switchable -> Switchable
|
|
127
|
+
turnOn switchable = case switchable of
|
|
128
|
+
Light name _ -> Light name True
|
|
129
|
+
DimmableLight name _ -> DimmableLight name 100
|
|
130
|
+
Fan name _ speed -> Fan name True (max speed 1)
|
|
131
|
+
CompositeSwitchable name items -> CompositeSwitchable name (map turnOn items)
|
|
132
|
+
|
|
133
|
+
-- | Check if a switchable is on
|
|
134
|
+
isOn :: Switchable -> Bool
|
|
135
|
+
isOn switchable = case switchable of
|
|
136
|
+
Light _ on -> on
|
|
137
|
+
DimmableLight _ intensity -> intensity > 0
|
|
138
|
+
Fan _ on _ -> on
|
|
139
|
+
CompositeSwitchable _ items -> any isOn items
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 使用例
|
|
143
|
+
|
|
144
|
+
```haskell
|
|
145
|
+
-- 部屋のスイッチグループを作成
|
|
146
|
+
let bedroom = emptySwitchableComposite "Bedroom"
|
|
147
|
+
|> addSwitchable (Light "Ceiling" False)
|
|
148
|
+
|> addSwitchable (DimmableLight "Bedside" 0)
|
|
149
|
+
|
|
150
|
+
let livingRoom = emptySwitchableComposite "LivingRoom"
|
|
151
|
+
|> addSwitchable (Light "Main" False)
|
|
152
|
+
|> addSwitchable (Fan "CeilingFan" False 0)
|
|
153
|
+
|
|
154
|
+
-- 家全体のグループ
|
|
155
|
+
let house = emptySwitchableComposite "House"
|
|
156
|
+
|> addSwitchable bedroom
|
|
157
|
+
|> addSwitchable livingRoom
|
|
158
|
+
|
|
159
|
+
-- 家中の全てのスイッチをオン
|
|
160
|
+
let allOn = turnOn house
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## 4. FileSystem - ファイルシステムの Composite パターン
|
|
164
|
+
|
|
165
|
+
```haskell
|
|
166
|
+
-- | FileSystemEntry - Composite pattern for file system
|
|
167
|
+
data FileSystemEntry
|
|
168
|
+
= File String Int String -- ^ File with name, size, and extension
|
|
169
|
+
| Directory String [FileSystemEntry] -- ^ Directory with name and children
|
|
170
|
+
deriving (Show, Eq)
|
|
171
|
+
|
|
172
|
+
-- | Get the total size of a file system entry
|
|
173
|
+
fileSize :: FileSystemEntry -> Int
|
|
174
|
+
fileSize entry = case entry of
|
|
175
|
+
File _ size _ -> size
|
|
176
|
+
Directory _ children -> sum (map fileSize children)
|
|
177
|
+
|
|
178
|
+
-- | Find files by extension
|
|
179
|
+
findByExtension :: String -> FileSystemEntry -> [FileSystemEntry]
|
|
180
|
+
findByExtension ext entry = case entry of
|
|
181
|
+
File _ _ fileExt | fileExt == ext -> [entry]
|
|
182
|
+
File {} -> []
|
|
183
|
+
Directory _ children -> concatMap (findByExtension ext) children
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 使用例
|
|
187
|
+
|
|
188
|
+
```haskell
|
|
189
|
+
-- ファイルシステム構造を構築
|
|
190
|
+
let readme = File "readme.txt" 1024 ".txt"
|
|
191
|
+
let config = File "config.json" 512 ".json"
|
|
192
|
+
let src = Directory "src"
|
|
193
|
+
[ File "main.fs" 2048 ".fs"
|
|
194
|
+
, File "util.fs" 1024 ".fs"
|
|
195
|
+
]
|
|
196
|
+
let root = Directory "project" [readme, config, src]
|
|
197
|
+
|
|
198
|
+
-- 総サイズを取得
|
|
199
|
+
let totalSize = fileSize root -- 4608
|
|
200
|
+
|
|
201
|
+
-- .fs ファイルを検索
|
|
202
|
+
let fsFiles = findByExtension ".fs" root -- 2 files
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 5. MenuItem - メニューの Composite パターン
|
|
206
|
+
|
|
207
|
+
```haskell
|
|
208
|
+
-- | MenuItem - Composite pattern for menu items
|
|
209
|
+
data MenuItem
|
|
210
|
+
= Item String Double String -- ^ Item with name, price, and category
|
|
211
|
+
| SetMenu String [MenuItem] Double -- ^ Set menu with name, items, and discount rate
|
|
212
|
+
deriving (Show, Eq)
|
|
213
|
+
|
|
214
|
+
-- | Calculate the price of a menu item
|
|
215
|
+
menuPrice :: MenuItem -> Double
|
|
216
|
+
menuPrice item = case item of
|
|
217
|
+
Item _ price _ -> price
|
|
218
|
+
SetMenu _ items discountRate ->
|
|
219
|
+
let totalPrice = sum (map menuPrice items)
|
|
220
|
+
in totalPrice * (1 - discountRate)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 使用例
|
|
224
|
+
|
|
225
|
+
```haskell
|
|
226
|
+
-- 単品メニュー
|
|
227
|
+
let burger = Item "Hamburger" 500 "Main"
|
|
228
|
+
let fries = Item "Fries" 200 "Side"
|
|
229
|
+
let drink = Item "Cola" 150 "Drink"
|
|
230
|
+
|
|
231
|
+
-- セットメニュー(10%割引)
|
|
232
|
+
let lunchSet = SetMenu "Lunch Set" [burger, fries, drink] 0.1
|
|
233
|
+
|
|
234
|
+
-- セット価格 = (500 + 200 + 150) * 0.9 = 765
|
|
235
|
+
let setPrice = menuPrice lunchSet
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## 6. Expression - 数式の Composite パターン
|
|
239
|
+
|
|
240
|
+
```haskell
|
|
241
|
+
-- | Expression - Composite pattern for mathematical expressions
|
|
242
|
+
data Expr
|
|
243
|
+
= Number Double -- ^ Numeric literal
|
|
244
|
+
| Variable String (Maybe Double) -- ^ Variable with optional bound value
|
|
245
|
+
| Add Expr Expr -- ^ Addition
|
|
246
|
+
| Subtract Expr Expr -- ^ Subtraction
|
|
247
|
+
| Multiply Expr Expr -- ^ Multiplication
|
|
248
|
+
| Divide Expr Expr -- ^ Division
|
|
249
|
+
| Negate Expr -- ^ Negation
|
|
250
|
+
deriving (Show, Eq)
|
|
251
|
+
|
|
252
|
+
-- | Evaluate an expression
|
|
253
|
+
evaluate :: Expr -> Maybe Double
|
|
254
|
+
evaluate expr = case expr of
|
|
255
|
+
Number n -> Just n
|
|
256
|
+
Variable _ (Just v) -> Just v
|
|
257
|
+
Variable _ Nothing -> Nothing -- Unbound variable
|
|
258
|
+
Add l r -> (+) <$> evaluate l <*> evaluate r
|
|
259
|
+
Subtract l r -> (-) <$> evaluate l <*> evaluate r
|
|
260
|
+
Multiply l r -> (*) <$> evaluate l <*> evaluate r
|
|
261
|
+
Divide l r -> do
|
|
262
|
+
lv <- evaluate l
|
|
263
|
+
rv <- evaluate r
|
|
264
|
+
if rv == 0 then Nothing else Just (lv / rv)
|
|
265
|
+
Negate e -> negate <$> evaluate e
|
|
266
|
+
|
|
267
|
+
-- | Simplify an expression
|
|
268
|
+
simplify :: Expr -> Expr
|
|
269
|
+
simplify expr = case expr of
|
|
270
|
+
Add l r -> case (simplify l, simplify r) of
|
|
271
|
+
(Number 0, r') -> r'
|
|
272
|
+
(l', Number 0) -> l'
|
|
273
|
+
(Number a, Number b) -> Number (a + b)
|
|
274
|
+
(l', r') -> Add l' r'
|
|
275
|
+
-- ... other cases
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 使用例
|
|
279
|
+
|
|
280
|
+
```haskell
|
|
281
|
+
-- (2 + 3) * 4 = 20
|
|
282
|
+
let expr = Multiply (Add (Number 2) (Number 3)) (Number 4)
|
|
283
|
+
let result = evaluate expr -- Just 20
|
|
284
|
+
|
|
285
|
+
-- 変数を含む式
|
|
286
|
+
let exprWithVars = Add (Variable "x" Nothing) (Variable "y" Nothing)
|
|
287
|
+
let bound = bindVars [("x", 10), ("y", 20)] exprWithVars
|
|
288
|
+
let value = evaluate bound -- Just 30
|
|
289
|
+
|
|
290
|
+
-- 式の簡略化
|
|
291
|
+
let simplified = simplify (Add (Variable "x" Nothing) (Number 0))
|
|
292
|
+
-- => Variable "x" Nothing
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## 7. Organization - 組織構造の Composite パターン
|
|
296
|
+
|
|
297
|
+
```haskell
|
|
298
|
+
-- | OrganizationMember - Composite pattern for organizational structure
|
|
299
|
+
data OrganizationMember
|
|
300
|
+
= Employee String Double String -- ^ Employee with name, salary, and role
|
|
301
|
+
| Department String (Maybe String) [OrganizationMember]
|
|
302
|
+
-- ^ Department with name, manager, and members
|
|
303
|
+
deriving (Show, Eq)
|
|
304
|
+
|
|
305
|
+
-- | Calculate the total salary
|
|
306
|
+
totalSalary :: OrganizationMember -> Double
|
|
307
|
+
totalSalary member = case member of
|
|
308
|
+
Employee _ salary _ -> salary
|
|
309
|
+
Department _ _ members -> sum (map totalSalary members)
|
|
310
|
+
|
|
311
|
+
-- | Find employees by role
|
|
312
|
+
findByRole :: String -> OrganizationMember -> [OrganizationMember]
|
|
313
|
+
findByRole role member = case member of
|
|
314
|
+
Employee _ _ r | r == role -> [member]
|
|
315
|
+
Employee {} -> []
|
|
316
|
+
Department _ _ members -> concatMap (findByRole role) members
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## パターンの利点
|
|
320
|
+
|
|
321
|
+
1. **統一的な操作**: 個々のオブジェクトとグループを同じインターフェースで操作可能
|
|
322
|
+
2. **階層構造**: ネストした構造を自然に表現可能
|
|
323
|
+
3. **拡張性**: 新しい Leaf や Composite を追加しやすい
|
|
324
|
+
4. **再帰的な構造**: Composite は他の Composite を含むことも可能
|
|
325
|
+
|
|
326
|
+
## Haskell での特徴
|
|
327
|
+
|
|
328
|
+
### 代数的データ型による型安全性
|
|
329
|
+
|
|
330
|
+
```haskell
|
|
331
|
+
-- 全てのケースを網羅するパターンマッチ
|
|
332
|
+
shapeArea :: Shape -> Double
|
|
333
|
+
shapeArea shape = case shape of
|
|
334
|
+
Circle _ r -> pi * r * r
|
|
335
|
+
Square _ s -> s * s
|
|
336
|
+
Rectangle _ w h -> w * h
|
|
337
|
+
CompositeShape shapes -> sum (map shapeArea shapes)
|
|
338
|
+
-- 新しいケースを追加すると、コンパイラが警告を出す
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### 不変性による安全な操作
|
|
342
|
+
|
|
343
|
+
```haskell
|
|
344
|
+
-- 元のオブジェクトは変更されない
|
|
345
|
+
let original = addShape (Circle (Point 0 0) 5) emptyComposite
|
|
346
|
+
let moved = translateShape 10 10 original
|
|
347
|
+
-- original は変更されていない
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 再帰関数と高階関数
|
|
351
|
+
|
|
352
|
+
```haskell
|
|
353
|
+
-- 再帰的な処理も簡潔に
|
|
354
|
+
let result = emptyComposite
|
|
355
|
+
& addShape circle
|
|
356
|
+
& addShape square
|
|
357
|
+
& translateShape 5 5
|
|
358
|
+
& scaleShape 2
|
|
359
|
+
& shapeArea
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## Clojure/F# との比較
|
|
363
|
+
|
|
364
|
+
| 概念 | Clojure | F# | Haskell |
|
|
365
|
+
|------|---------|-----|---------|
|
|
366
|
+
| インターフェース | マルチメソッド | 判別共用体 | ADT |
|
|
367
|
+
| Leaf | defmethod | Union case | Constructor |
|
|
368
|
+
| Composite | defmethod + mapv | Union case with list | Constructor with list |
|
|
369
|
+
| 操作の委譲 | mapv | List.map | map |
|
|
370
|
+
| 不変性 | デフォルト | デフォルト | 強制 |
|
|
371
|
+
| 網羅性チェック | なし | 完全チェック | 完全チェック |
|
|
372
|
+
|
|
373
|
+
## まとめ
|
|
374
|
+
|
|
375
|
+
本章では、Composite パターンについて学びました:
|
|
376
|
+
|
|
377
|
+
1. **Shape の例**: 図形の移動と拡大を統一的に操作
|
|
378
|
+
2. **Switchable の例**: 複数のスイッチをグループ化して操作
|
|
379
|
+
3. **FileSystem の例**: ファイルとディレクトリの階層構造
|
|
380
|
+
4. **Menu の例**: 単品とセットメニューの価格計算
|
|
381
|
+
5. **Expression の例**: 数式の評価と簡略化
|
|
382
|
+
6. **Organization の例**: 組織構造の給与計算
|
|
383
|
+
|
|
384
|
+
Composite パターンは、ツリー構造のデータを扱う際に非常に有効なパターンです。Haskell の代数的データ型とパターンマッチを使うことで、型安全で不変なツリー構造を簡潔に実装できます。
|
|
385
|
+
|
|
386
|
+
## 参考コード
|
|
387
|
+
|
|
388
|
+
本章のコード例は以下のファイルで確認できます:
|
|
389
|
+
|
|
390
|
+
- ソースコード: `apps/haskell/part3/src/CompositePattern.hs`
|
|
391
|
+
- テストコード: `apps/haskell/part3/test/CompositePatternSpec.hs`
|
|
392
|
+
|
|
393
|
+
## 次章予告
|
|
394
|
+
|
|
395
|
+
次章では、**Decorator パターン**について学びます。既存の機能に新しい機能を動的に追加する方法を探ります。
|