Exercise 3: Why Choosing AsyncSequence Over Combine in an async/await-Based Project Is a Real Consistency Win — Possible Solution ========================================================================================================================================= TaskFlow, and every real example built across this entire course, has consistently used exactly one real asynchronous vocabulary throughout - async/await, Task, and (from Chapter 2) async let and actor. Every developer who has already worked through Chapters 1-9's own real code has built a working mental model specifically around that one consistent set of concepts: a suspension point is always marked with await, a unit of concurrent work is always a Task, and so on. Introducing Combine into that same project specifically for handling multi-value streams would mean maintaining TWO genuinely different real asynchronous paradigms side by side, each with its OWN separate set of concepts, its own separate mental model, and its own separate real failure modes to learn and watch for - Combine's own Publisher/ Subscriber/operator-chain vocabulary and cancellation-via-AnyCancellable model (Exercise 2's own real pain point) are genuinely different from, not simply a stylistic variant of, async/await's own model. A developer reading the codebase would need to correctly recognize which of the two systems any given piece of asynchronous code was actually built on before they could even begin reasoning about how it behaves. Choosing AsyncSequence/AsyncStream instead means every asynchronous concept in the entire project - whether it's a one-shot network call, a parallel async let, an actor-protected piece of state, or a genuine multi-value stream - is expressed using the exact same real vocabulary and the exact same real mental model throughout. This isn't merely an aesthetic preference for one syntax over another - it's a concrete, practical reduction in how many genuinely different systems a developer maintaining the codebase later has to hold in their head at once, and it means the auto-cancellation behavior this course has relied on since Fundamentals Chapter 9's own .task {} modifier applies uniformly to streams too, rather than needing a second, separate cancellation discipline bolted on specifically for Combine code. ANSWER: Choosing AsyncSequence over Combine in a project already built on async/await avoids maintaining two genuinely separate asynchronous paradigms side by side, each with its own distinct vocabulary, mental model, and failure modes. It's a real, practical reduction in cognitive load for anyone reading or maintaining the codebase, and it means the same automatic-cancellation behavior already relied on throughout this course (from Fundamentals' own .task {} onward) applies consistently to streams too, rather than needing a second, separate cleanup discipline just for Combine. WHY THIS WORKS AS AN ANSWER ------------------------------ This identifies the real, concrete cost of running two separate asynchronous paradigms in one codebase and explains why unifying on one - already established throughout this course - is a genuine practical win, not merely a stylistic preference.