diff --git a/NucleicRemote/NucleicRemote/Views/SessionsView.swift b/NucleicRemote/NucleicRemote/Views/SessionsView.swift index cd4be2a..9b6ef9d 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionsView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionsView.swift @@ -11,9 +11,15 @@ struct SessionsView: View { private var grouped: [(title: String, rows: [WireSessionSummary])] { let pool = (showArchived ? store.sessions : store.liveSessions) .sorted(by: StatusStyle.attentionThenRecency) - let needs = pool.filter { $0.status.needsYou($0.disposition) } - let running = pool.filter { $0.status == .running || $0.status == .provisioning || $0.status == .idle } - let done = pool.filter { !needs.contains($0) && !running.contains($0) } + // One pass, first bucket wins — the old `done = pool.filter { !needs.contains($0) … }` + // ran O(rows²) full-summary equality scans on every body evaluation. + var needs: [WireSessionSummary] = [], running: [WireSessionSummary] = [], done: [WireSessionSummary] = [] + for summary in pool { + if summary.status.needsYou(summary.disposition) { needs.append(summary) } + else if summary.status == .running || summary.status == .provisioning || summary.status == .idle { + running.append(summary) + } else { done.append(summary) } + } return [("Needs you", needs), ("Running", running), ("Done", done)].filter { !$0.rows.isEmpty } }