install
source · Clone the upstream repo
git clone https://github.com/Intense-Visions/harness-engineering
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Intense-Visions/harness-engineering "$T" && mkdir -p ~/.claude/skills && cp -r "$T/agents/skills/claude-code/js-iterator-pattern" ~/.claude/skills/intense-visions-harness-engineering-js-iterator-pattern && rm -rf "$T"
manifest:
agents/skills/claude-code/js-iterator-pattern/SKILL.mdsource content
JS Iterator Pattern
Traverse a collection sequentially without exposing its internal structure
When to Use
- You need to iterate over a custom data structure (tree, graph, linked list) with
for...of - You want to provide lazy, on-demand values without generating the entire collection upfront
- Building data pipelines that compose iterables (filter, map, take)
Instructions
- Implement the iterator protocol: an object with a
method returningnext()
.{ value, done } - Make a collection iterable by adding
that returns an iterator.[Symbol.iterator]() - Use generator functions (
) for the cleanest iterator implementation.function* - Use
to consume iterables.for...of
class Range { constructor(start, end) { this.start = start; this.end = end; } [Symbol.iterator]() { let current = this.start; const end = this.end; return { next() { return current <= end ? { value: current++, done: false } : { value: undefined, done: true }; }, }; } } for (const n of new Range(1, 3)) { console.log(n); // 1, 2, 3 }
- Generator shorthand:
.*[Symbol.iterator]() { for (let i = this.start; i <= this.end; i++) yield i; }
Details
JavaScript has a built-in iteration protocol. Any object with a
[Symbol.iterator]() method is iterable and works with for...of, spread (...), destructuring, Array.from(), and Promise.all(). Generators (function*) are the simplest way to create custom iterators.
Trade-offs:
- Custom iterators add complexity — only worthwhile for non-trivial data structures
- Infinite iterators (no
) will hangdone: true
loops unless guardedfor...of - Generator objects are single-use — once exhausted, they cannot be reset
When NOT to use:
- For arrays and built-in collections — they are already iterable
- When you need random access — iterators are sequential by design
Source
https://patterns.dev/javascript/iterator-pattern
Process
- Read the instructions and examples in this document.
- Apply the patterns to your implementation, adapting to your specific context.
- Verify your implementation against the details and edge cases listed above.
Harness Integration
- Type: knowledge — this skill is a reference document, not a procedural workflow.
- No tools or state — consumed as context by other skills and agents.
Success Criteria
- The patterns described in this document are applied correctly in the implementation.
- Edge cases and anti-patterns listed in this document are avoided.