@memo
compute_damage() cached — same atk/def/bonus/roll = cache hit
nested match
element_bonus(heroClass, weakness) — two axes in one expression
param guards
create_hero() injects 5 validators — HP, StatValue×2, Level, HeroName
.field pipelines
party |> filter(.alive) |> map(.hp) |> sum