# Повторный линейный проход / Повторно вычисляется lazy pipeline

RuleID: performance.repeated-linear-traversal@1.0.0
Status: recovery-required
Catalog snapshot: 4558458d

Accepted subset is bounded. If required evidence is incomplete, the affected result is unknown.

## V-PERF-01 — Повторный линейный проход

Линейный поиск внутри цикла превращает обработку двух коллекций в произведение их размеров. При подходящей семантике индекс строится один раз.

Status: recovery-required

Scope notes: Source producer требует восстановления и квалификации. Если необходимые факты не получены, результат — unknown, а не «ошибки нет».

### Before (illustrative)

```swift
for item in items {
    if allowed.contains(item.id) { accept(item) }
}
```

### After (illustrative)

```swift
let allowedIDs = Set(allowed)
for item in items {
    if allowedIDs.contains(item.id) { accept(item) }
}
```

Boundary: Array.count/cached query не линейны; учитывать actual collection

## V-PERF-05 — Повторно вычисляется lazy pipeline

Lazy-последовательность может повторно вычислять элементы при каждом обходе. Lazy не означает memoization.

Status: recovery-required

Scope notes: Source producer требует восстановления и квалификации. Если необходимые факты не получены, результат — unknown, а не «ошибки нет».

### Before (illustrative)

```swift
let values = input.lazy.map(expensive)
consume(values.reduce(0, +))
consume(values.reduce(0, +))
```

### After (illustrative)

```swift
let values = input.map(expensive)
consume(values.reduce(0, +))
consume(values.reduce(0, +))
```

Boundary: Wrapper creation и закэшированный результат

---
Language: ru
Canonical: https://docs.swift-analyzer.com/catalog/performance.repeated-linear-traversal/
Source revision: 4558458d
