agy-superpowers 5.2.2 → 5.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/README.md +47 -150
  2. package/package.json +1 -1
  3. package/template/agent/rules/CLAUDE.md +80 -0
  4. package/template/agent/rules/code-styles.md +31 -32
  5. package/template/agent/rules/debug-confirmation-policy.md +2 -0
  6. package/template/agent/rules/file-length-policy.md +2 -0
  7. package/template/agent/rules/git-policy.md +7 -0
  8. package/template/agent/rules/language-matching.md +2 -0
  9. package/template/agent/rules/scratch-scripts.md +39 -0
  10. package/template/agent/rules/superpowers.md +8 -51
  11. package/template/agent/skills/executing-plans/SKILL.md +17 -0
  12. package/template/agent/skills/systematic-debugging/SKILL.md +16 -0
  13. package/template/agent/skills/test-driven-development/SKILL.md +16 -0
  14. package/template/agent/skills/verification-before-completion/SKILL.md +22 -0
  15. package/template/agent/skills/writing-plans/SKILL.md +16 -0
  16. package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
  17. package/template/agent/skills/analytics-setup/SKILL.md +0 -51
  18. package/template/agent/skills/api-design/SKILL.md +0 -193
  19. package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
  20. package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
  21. package/template/agent/skills/backend-developer/SKILL.md +0 -148
  22. package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
  23. package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
  24. package/template/agent/skills/community-manager/SKILL.md +0 -115
  25. package/template/agent/skills/content-marketer/SKILL.md +0 -111
  26. package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
  27. package/template/agent/skills/cto-architect/SKILL.md +0 -133
  28. package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
  29. package/template/agent/skills/data-analyst/SKILL.md +0 -147
  30. package/template/agent/skills/devops-engineer/SKILL.md +0 -117
  31. package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
  32. package/template/agent/skills/game-design/SKILL.md +0 -194
  33. package/template/agent/skills/game-developer/SKILL.md +0 -175
  34. package/template/agent/skills/growth-hacker/SKILL.md +0 -122
  35. package/template/agent/skills/idea-validator/SKILL.md +0 -55
  36. package/template/agent/skills/indie-legal/SKILL.md +0 -53
  37. package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
  38. package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
  39. package/template/agent/skills/launch-strategist/SKILL.md +0 -62
  40. package/template/agent/skills/market-researcher/SKILL.md +0 -53
  41. package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
  42. package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
  43. package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
  44. package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
  45. package/template/agent/skills/real-time-features/SKILL.md +0 -194
  46. package/template/agent/skills/retention-specialist/SKILL.md +0 -123
  47. package/template/agent/skills/rust-developer/SKILL.md +0 -281
  48. package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
  49. package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
  50. package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
  51. package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
  52. package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
  53. package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
  54. package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
  55. package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
  56. package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
  57. package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
  58. package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
  59. package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
  60. package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
  61. package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
  62. package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
  63. package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
  64. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
  65. package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
  66. package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
  67. package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
  68. package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
  69. package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
  70. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
  71. package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
  72. package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
  73. package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
  74. package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
  75. package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
  76. package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
  77. package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
  78. package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
  79. package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
  80. package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
  81. package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
  82. package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
  83. package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
  84. package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
  85. package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
  86. package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
  87. package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
  88. package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
  89. package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
  90. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
  91. package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
  92. package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
  93. package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
  94. package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
  95. package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
  96. package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
  97. package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
  98. package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
  99. package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
  100. package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
  101. package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
  102. package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
  103. package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
  104. package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
  105. package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
  106. package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
  107. package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
  108. package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
  109. package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
  110. package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
  111. package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
  112. package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
  113. package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
  114. package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
  115. package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
  116. package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
  117. package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
  118. package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
  119. package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
  120. package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
  121. package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
  122. package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
  123. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
  124. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
  125. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
  126. package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
  127. package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
  128. package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
  129. package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
  130. package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
  131. package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
  132. package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
  133. package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
  134. package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
  135. package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
  136. package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
  137. package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
  138. package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
  139. package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
  140. package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
  141. package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
  142. package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
  143. package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
  144. package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
  145. package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
  146. package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
  147. package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
  148. package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
  149. package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
  150. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
  151. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
  152. package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
  153. package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
  154. package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
  155. package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
  156. package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
  157. package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
  158. package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
  159. package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
  160. package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
  161. package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
  162. package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
  163. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
  164. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
  165. package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
  166. package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
  167. package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
  168. package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
  169. package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
  170. package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
  171. package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
  172. package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
  173. package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
  174. package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
  175. package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
  176. package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
  177. package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
  178. package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
  179. package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
  180. package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
  181. package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
  182. package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
  183. package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
  184. package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
  185. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
  186. package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
  187. package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
  188. package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
  189. package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
  190. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
  191. package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
  192. package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
  193. package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
  194. package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
  195. package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
  196. package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
  197. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
  198. package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
  199. package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
  200. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
  201. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
  202. package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
  203. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
  204. package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
  205. package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
  206. package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
  207. package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
  208. package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
  209. package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
  210. package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
  211. package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
  212. package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
  213. package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
  214. package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
  215. package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
  216. package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
  217. package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
  218. package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
  219. package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
  220. package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
  221. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
  222. package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
  223. package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
  224. package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
  225. package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
  226. package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
  227. package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
  228. package/template/agent/skills/saas-architect/SKILL.md +0 -139
  229. package/template/agent/skills/security-engineer/SKILL.md +0 -133
  230. package/template/agent/skills/seo-specialist/SKILL.md +0 -130
  231. package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
@@ -1,92 +0,0 @@
1
- # name-type-param-single
2
-
3
- > Use single uppercase letters for type parameters: `T`, `E`, `K`, `V`
4
-
5
- ## Why It Matters
6
-
7
- Generic type parameters conventionally use single uppercase letters. This keeps signatures concise and follows established conventions that readers instantly recognize. `T` for "type", `E` for "error", `K` for "key", `V` for "value" are universal in Rust.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Verbose type parameters
13
- struct Container<ElementType> {
14
- items: Vec<ElementType>,
15
- }
16
-
17
- fn process<InputType, OutputType>(input: InputType) -> OutputType { ... }
18
-
19
- // Lowercase - looks like lifetime
20
- struct Wrapper<t> { ... } // Confusing
21
- ```
22
-
23
- ## Good
24
-
25
- ```rust
26
- // Single uppercase letters
27
- struct Container<T> {
28
- items: Vec<T>,
29
- }
30
-
31
- fn process<I, O>(input: I) -> O { ... }
32
-
33
- // Standard conventions
34
- struct HashMap<K, V> { ... } // K=Key, V=Value
35
- enum Result<T, E> { ... } // T=Type, E=Error
36
- enum Option<T> { ... } // T=Type
37
- struct Ref<'a, T> { ... } // Lifetime + Type
38
- ```
39
-
40
- ## Standard Type Parameter Names
41
-
42
- | Parameter | Meaning | Example |
43
- |-----------|---------|---------|
44
- | `T` | Type (generic) | `Vec<T>` |
45
- | `E` | Error | `Result<T, E>` |
46
- | `K` | Key | `HashMap<K, V>` |
47
- | `V` | Value | `HashMap<K, V>` |
48
- | `I` | Input / Item | `Iterator<Item = I>` |
49
- | `O` | Output | `Fn(I) -> O` |
50
- | `R` | Return / Result | `fn() -> R` |
51
- | `S` | State | `StateMachine<S>` |
52
- | `A` | Allocator | `Vec<T, A>` |
53
- | `F` | Function | `map<F>(f: F)` |
54
-
55
- ## Multiple Type Parameters
56
-
57
- ```rust
58
- // Use related letters
59
- fn transform<I, O, E>(input: I) -> Result<O, E>
60
- where
61
- I: Input,
62
- O: Output,
63
- E: Error,
64
- { ... }
65
-
66
- // Or sequential: T, U, V
67
- fn combine<T, U, V>(a: T, b: U) -> V { ... }
68
-
69
- // Descriptive only when many parameters need clarity
70
- struct Query<Db, Row, Err> { ... }
71
- ```
72
-
73
- ## Trait Bounds
74
-
75
- ```rust
76
- // Keep type params short, move complexity to where clause
77
- fn process<T, E>(value: T) -> Result<T, E>
78
- where
79
- T: Clone + Debug + Send + Sync,
80
- E: Error + From<IoError>,
81
- { ... }
82
-
83
- // Not inline
84
- fn process<T: Clone + Debug + Send + Sync, E: Error + From<IoError>>(value: T) -> Result<T, E>
85
- // Too long!
86
- ```
87
-
88
- ## See Also
89
-
90
- - [name-lifetime-short](./name-lifetime-short.md) - Lifetime parameter naming
91
- - [name-types-camel](./name-types-camel.md) - Concrete type naming
92
- - [type-generic-bounds](./type-generic-bounds.md) - Trait bounds
@@ -1,65 +0,0 @@
1
- # name-types-camel
2
-
3
- > Use `UpperCamelCase` for types, traits, and enum names
4
-
5
- ## Why It Matters
6
-
7
- Rust's naming conventions are enforced by the compiler and linter. Consistent naming makes code immediately recognizable—you know `HttpClient` is a type, `send_request` is a function. Violating conventions triggers warnings and makes code harder to read.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Lowercase types - compiler warns
13
- struct http_client { ... } // warning: type `http_client` should have an upper camel case name
14
- trait serializable { ... } // warning
15
- enum response_type { ... } // warning
16
-
17
- // Screaming case for types
18
- struct HTTP_CLIENT { ... } // Not idiomatic
19
- ```
20
-
21
- ## Good
22
-
23
- ```rust
24
- // UpperCamelCase for all types
25
- struct HttpClient { ... }
26
- trait Serializable { ... }
27
- enum ResponseType { ... }
28
-
29
- // Compound words
30
- struct TcpConnection { ... }
31
- struct IoError { ... }
32
- struct FileReader { ... }
33
-
34
- // Generic types
35
- struct HashMap<K, V> { ... }
36
- struct Result<T, E> { ... }
37
- ```
38
-
39
- ## Acronyms
40
-
41
- ```rust
42
- // Treat acronyms as words (capitalize first letter only)
43
- struct HttpServer { ... } // Not HTTPServer
44
- struct JsonParser { ... } // Not JSONParser
45
- struct Uuid { ... } // Not UUID
46
- struct TcpStream { ... } // Not TCPStream
47
-
48
- // Exception: Two-letter acronyms can be all caps
49
- struct IOError { ... } // Acceptable
50
- struct IoError { ... } // Also acceptable (preferred)
51
- ```
52
-
53
- ## Type Aliases
54
-
55
- ```rust
56
- // Type aliases also use UpperCamelCase
57
- type Result<T> = std::result::Result<T, Error>;
58
- type BoxedFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
59
- ```
60
-
61
- ## See Also
62
-
63
- - [name-variants-camel](./name-variants-camel.md) - Enum variant naming
64
- - [name-funcs-snake](./name-funcs-snake.md) - Function naming
65
- - [name-acronym-word](./name-acronym-word.md) - Acronym handling
@@ -1,101 +0,0 @@
1
- # name-variants-camel
2
-
3
- > Use `UpperCamelCase` for enum variants
4
-
5
- ## Why It Matters
6
-
7
- Enum variants follow the same naming convention as types—`UpperCamelCase`. This distinguishes them from fields, variables, and functions. The compiler warns on violations, and consistent naming helps readers instantly recognize variant names.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- enum Status {
13
- pending, // warning: variant `pending` should have an upper camel case name
14
- in_progress, // warning
15
- COMPLETED, // Not idiomatic
16
- }
17
-
18
- enum Color {
19
- RED, // Screaming case - not Rust style
20
- GREEN,
21
- BLUE,
22
- }
23
- ```
24
-
25
- ## Good
26
-
27
- ```rust
28
- enum Status {
29
- Pending,
30
- InProgress,
31
- Completed,
32
- Failed,
33
- }
34
-
35
- enum Color {
36
- Red,
37
- Green,
38
- Blue,
39
- Custom(u8, u8, u8),
40
- }
41
-
42
- enum HttpMethod {
43
- Get,
44
- Post,
45
- Put,
46
- Delete,
47
- Patch,
48
- }
49
- ```
50
-
51
- ## Variants with Data
52
-
53
- ```rust
54
- enum Message {
55
- // Unit variant
56
- Quit,
57
-
58
- // Tuple variant
59
- Move(i32, i32),
60
-
61
- // Struct variant
62
- Write { text: String },
63
-
64
- // Named fields
65
- ChangeColor {
66
- red: u8,
67
- green: u8,
68
- blue: u8,
69
- },
70
- }
71
- ```
72
-
73
- ## Variant Naming Tips
74
-
75
- ```rust
76
- // Be specific
77
- enum Error {
78
- NotFound, // Good: specific
79
- PermissionDenied, // Good: specific
80
- Error, // Bad: vague
81
- }
82
-
83
- // Avoid redundant type name in variant
84
- enum ConnectionState {
85
- Connected, // Good
86
- Disconnected, // Good
87
- ConnectionError, // Bad: redundant "Connection"
88
- }
89
-
90
- // Use None/Some pattern for Option-like enums
91
- enum MaybeValue<T> {
92
- Some(T),
93
- None,
94
- }
95
- ```
96
-
97
- ## See Also
98
-
99
- - [name-types-camel](./name-types-camel.md) - Type naming
100
- - [api-non-exhaustive](./api-non-exhaustive.md) - Forward-compatible enums
101
- - [type-enum-states](./type-enum-states.md) - State machine enums
@@ -1,161 +0,0 @@
1
- # opt-bounds-check
2
-
3
- > Use iterators and patterns that eliminate bounds checks in hot paths
4
-
5
- ## Why It Matters
6
-
7
- Rust's safety guarantees require bounds checking on array/slice indexing. In tight loops, these checks can cause measurable overhead (branch mispredictions, preventing vectorization). Patterns like iterators, `get_unchecked`, and index splitting can eliminate these checks while maintaining safety.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- fn sum_products(a: &[f64], b: &[f64]) -> f64 {
13
- let mut sum = 0.0;
14
- for i in 0..a.len() {
15
- sum += a[i] * b[i]; // Two bounds checks per iteration
16
- }
17
- sum
18
- }
19
-
20
- fn apply_filter(data: &mut [u8], kernel: &[u8; 3]) {
21
- for i in 1..data.len() - 1 {
22
- // Three bounds checks per iteration
23
- data[i] = (data[i - 1] + data[i] + data[i + 1]) / 3;
24
- }
25
- }
26
- ```
27
-
28
- ## Good
29
-
30
- ```rust
31
- fn sum_products(a: &[f64], b: &[f64]) -> f64 {
32
- // Iterator zips - no bounds checks, vectorizes well
33
- a.iter().zip(b.iter()).map(|(x, y)| x * y).sum()
34
- }
35
-
36
- fn apply_filter(data: &mut [u8]) {
37
- // Windows pattern - no bounds checks
38
- for window in data.windows(3) {
39
- // window[0], window[1], window[2] are all valid
40
- }
41
-
42
- // Or use chunks
43
- for chunk in data.chunks_exact(4) {
44
- process_simd(chunk);
45
- }
46
- }
47
- ```
48
-
49
- ## Iterator Patterns
50
-
51
- ```rust
52
- // All of these avoid bounds checks:
53
-
54
- // zip - parallel iteration
55
- for (a, b) in xs.iter().zip(ys.iter()) { ... }
56
-
57
- // enumerate - index + value
58
- for (i, x) in data.iter().enumerate() { ... }
59
-
60
- // windows - sliding window
61
- for window in data.windows(3) { ... }
62
-
63
- // chunks - fixed-size groups
64
- for chunk in data.chunks(4) { ... }
65
- for chunk in data.chunks_exact(4) { ... } // Guarantees exact size
66
-
67
- // split_at - divide slice
68
- let (left, right) = data.split_at(mid);
69
- ```
70
-
71
- ## Split for Parallel Access
72
-
73
- ```rust
74
- fn parallel_sum(data: &[i32]) -> i32 {
75
- // Split into independent chunks
76
- let (left, right) = data.split_at(data.len() / 2);
77
-
78
- // Process chunks without bounds checks
79
- let sum_left: i32 = left.iter().sum();
80
- let sum_right: i32 = right.iter().sum();
81
-
82
- sum_left + sum_right
83
- }
84
- ```
85
-
86
- ## get_unchecked for Proven Safety
87
-
88
- ```rust
89
- fn matrix_multiply(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
90
- assert!(a.len() >= n * n);
91
- assert!(b.len() >= n * n);
92
- assert!(c.len() >= n * n);
93
-
94
- for i in 0..n {
95
- for j in 0..n {
96
- let mut sum = 0.0;
97
- for k in 0..n {
98
- // SAFETY: bounds verified by asserts above
99
- unsafe {
100
- sum += a.get_unchecked(i * n + k)
101
- * b.get_unchecked(k * n + j);
102
- }
103
- }
104
- // SAFETY: bounds verified by asserts above
105
- unsafe {
106
- *c.get_unchecked_mut(i * n + j) = sum;
107
- }
108
- }
109
- }
110
- }
111
- ```
112
-
113
- ## Slice Patterns
114
-
115
- ```rust
116
- fn process_header(data: &[u8]) -> Option<Header> {
117
- // Slice pattern - single length check, no per-field checks
118
- let [a, b, c, d, rest @ ..] = data else {
119
- return None;
120
- };
121
-
122
- Some(Header {
123
- magic: *a,
124
- version: *b,
125
- flags: u16::from_le_bytes([*c, *d]),
126
- payload: rest,
127
- })
128
- }
129
- ```
130
-
131
- ## Verify Bounds Check Elimination
132
-
133
- ```bash
134
- # Check generated assembly
135
- cargo asm --release my_crate::hot_function
136
-
137
- # Look for 'cmp' and 'ja'/'jbe' instructions near array access
138
- # If eliminated, you'll see direct memory access
139
- ```
140
-
141
- ## When to Accept Bounds Checks
142
-
143
- ```rust
144
- // Random access patterns - checks unavoidable
145
- fn random_lookup(data: &[u8], indices: &[usize]) -> Vec<u8> {
146
- indices.iter()
147
- .filter_map(|&i| data.get(i).copied()) // Checked, but necessary
148
- .collect()
149
- }
150
-
151
- // Infrequent access - overhead negligible
152
- fn get_config(&self, key: &str) -> Option<&Value> {
153
- self.config.get(key) // Fine, not hot path
154
- }
155
- ```
156
-
157
- ## See Also
158
-
159
- - [opt-simd-portable](./opt-simd-portable.md) - SIMD requires unchecked access
160
- - [opt-cache-friendly](./opt-cache-friendly.md) - Cache-efficient patterns
161
- - [perf-profile-first](./perf-profile-first.md) - Identify actual hot paths
@@ -1,187 +0,0 @@
1
- # opt-cache-friendly
2
-
3
- > Organize data for cache-efficient access patterns
4
-
5
- ## Why It Matters
6
-
7
- Cache misses are expensive—a L3 cache miss costs ~100+ cycles vs ~4 cycles for L1 hit. Data layout and access patterns determine cache efficiency. Arrays of structs (AoS) vs structs of arrays (SoA), memory locality, and access patterns can make order-of-magnitude performance differences.
8
-
9
- ## Bad
10
-
11
- ```rust
12
- // Array of Structs (AoS) - poor cache use when accessing one field
13
- struct Particle {
14
- position: [f32; 3], // 12 bytes
15
- velocity: [f32; 3], // 12 bytes
16
- mass: f32, // 4 bytes
17
- id: u64, // 8 bytes
18
- flags: u8, // 1 byte + padding
19
- // Total: 40 bytes per particle
20
- }
21
-
22
- fn update_positions(particles: &mut [Particle], dt: f32) {
23
- for p in particles {
24
- // Access position and velocity - 24 bytes
25
- // But loads 40-byte struct per particle
26
- // 16 bytes wasted per cache line load
27
- p.position[0] += p.velocity[0] * dt;
28
- p.position[1] += p.velocity[1] * dt;
29
- p.position[2] += p.velocity[2] * dt;
30
- }
31
- }
32
- ```
33
-
34
- ## Good
35
-
36
- ```rust
37
- // Struct of Arrays (SoA) - cache-efficient for field access
38
- struct Particles {
39
- positions_x: Vec<f32>,
40
- positions_y: Vec<f32>,
41
- positions_z: Vec<f32>,
42
- velocities_x: Vec<f32>,
43
- velocities_y: Vec<f32>,
44
- velocities_z: Vec<f32>,
45
- masses: Vec<f32>,
46
- ids: Vec<u64>,
47
- flags: Vec<u8>,
48
- }
49
-
50
- fn update_positions(p: &mut Particles, dt: f32) {
51
- // Access contiguous memory - perfect cache utilization
52
- for (px, vx) in p.positions_x.iter_mut().zip(&p.velocities_x) {
53
- *px += vx * dt;
54
- }
55
- for (py, vy) in p.positions_y.iter_mut().zip(&p.velocities_y) {
56
- *py += vy * dt;
57
- }
58
- for (pz, vz) in p.positions_z.iter_mut().zip(&p.velocities_z) {
59
- *pz += vz * dt;
60
- }
61
- }
62
- ```
63
-
64
- ## Hot/Cold Splitting
65
-
66
- ```rust
67
- // Separate frequently and rarely accessed fields
68
- struct EntityHot {
69
- position: [f32; 3],
70
- velocity: [f32; 3],
71
- // Hot data - accessed every frame
72
- }
73
-
74
- struct EntityCold {
75
- name: String,
76
- creation_time: Instant,
77
- metadata: HashMap<String, Value>,
78
- // Cold data - rarely accessed
79
- }
80
-
81
- struct Entities {
82
- hot: Vec<EntityHot>,
83
- cold: Vec<EntityCold>,
84
- }
85
-
86
- // Hot loop touches only hot data
87
- fn update(entities: &mut Entities, dt: f32) {
88
- for e in &mut entities.hot {
89
- e.position[0] += e.velocity[0] * dt;
90
- // Cold data stays out of cache
91
- }
92
- }
93
- ```
94
-
95
- ## Prefetching
96
-
97
- ```rust
98
- // Process in cache-line-sized chunks
99
- const CACHE_LINE: usize = 64;
100
-
101
- fn process_with_prefetch(data: &mut [u8]) {
102
- for chunk in data.chunks_mut(CACHE_LINE) {
103
- // Prefetch next chunk while processing current
104
- // (automatic in many cases, manual for complex patterns)
105
- process_chunk(chunk);
106
- }
107
- }
108
-
109
- // Matrix multiplication - block for cache
110
- fn matmul_blocked(a: &[f64], b: &[f64], c: &mut [f64], n: usize) {
111
- const BLOCK: usize = 32; // Fits in L1 cache
112
-
113
- for i0 in (0..n).step_by(BLOCK) {
114
- for j0 in (0..n).step_by(BLOCK) {
115
- for k0 in (0..n).step_by(BLOCK) {
116
- // Process BLOCK x BLOCK tile
117
- for i in i0..min(i0 + BLOCK, n) {
118
- for j in j0..min(j0 + BLOCK, n) {
119
- // Inner loop operates on cached data
120
- }
121
- }
122
- }
123
- }
124
- }
125
- }
126
- ```
127
-
128
- ## Avoid Pointer Chasing
129
-
130
- ```rust
131
- // Bad: linked list - random memory access
132
- struct Node {
133
- value: i32,
134
- next: Option<Box<Node>>,
135
- }
136
-
137
- fn sum_linked(head: &Node) -> i32 {
138
- // Each node is a cache miss
139
- }
140
-
141
- // Good: contiguous vector
142
- fn sum_vector(data: &[i32]) -> i32 {
143
- data.iter().sum() // Sequential access, prefetcher happy
144
- }
145
-
146
- // Good: if graph needed, use indices
147
- struct Graph {
148
- values: Vec<i32>,
149
- edges: Vec<usize>, // Indices into values
150
- }
151
- ```
152
-
153
- ## Memory Layout Attributes
154
-
155
- ```rust
156
- // Ensure cache-line alignment
157
- #[repr(C, align(64))]
158
- struct CacheAligned {
159
- data: [u8; 64],
160
- }
161
-
162
- // Prevent false sharing in concurrent code
163
- #[repr(C, align(64))]
164
- struct PaddedCounter {
165
- value: AtomicU64,
166
- _pad: [u8; 56],
167
- }
168
- ```
169
-
170
- ## Measuring Cache Performance
171
-
172
- ```bash
173
- # Linux perf
174
- perf stat -e cache-references,cache-misses ./my_program
175
-
176
- # Detailed cache analysis
177
- perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses ./my_program
178
-
179
- # Cachegrind
180
- valgrind --tool=cachegrind ./my_program
181
- ```
182
-
183
- ## See Also
184
-
185
- - [mem-smaller-integers](./mem-smaller-integers.md) - Smaller data fits more in cache
186
- - [mem-box-large-variant](./mem-box-large-variant.md) - Keep enum sizes small
187
- - [opt-bounds-check](./opt-bounds-check.md) - Sequential access patterns