Section 5/161 menit

5. Operator Kombinasi

5. Operator Kombinasi

zip

zip menggabungkan elemen dari dua (atau lebih) sequence secara bersamaan — menghasilkan tuple satu per satu, menunggu masing-masing sequence menghasilkan elemen sebelum melanjutkan. Selesai saat sequence yang lebih pendek selesai.

swift
// zip: menunggu kedua sequence menghasilkan nilai sebelum emit tuple
let prices = AsyncStream<Double> { ... }    // stream harga real-time
let volumes = AsyncStream<Int> { ... }     // stream volume trading

for await (price, volume) in zip(prices, volumes) {
    let value = price * Double(volume)
    print("Nilai: \(value)")
    // Setiap iterasi menunggu KEDUANYA punya nilai baru
}
swift
// zip 3 sequence
let a = [1, 2, 3].async
let b = ["a", "b", "c"].async
let c = [true, false, true].async

for await (num, str, flag) in zip(a, b, c) {
    print(num, str, flag)  // (1, "a", true), (2, "b", false), (3, "c", true)
}

chain

chain menghubungkan sequence secara serial — sequence kedua dimulai setelah sequence pertama selesai.

swift
// chain: urutan serial, bukan paralel
let firstPageItems = fetchPage(1).async   // AsyncSequence dari page 1
let secondPageItems = fetchPage(2).async  // AsyncSequence dari page 2

// Proses semua item page 1, lalu page 2, dalam satu loop
for await item in chain(firstPageItems, secondPageItems) {
    process(item)
}

// Bisa chain banyak sequence
let allItems = chain(page1, page2, page3, page4)
for await item in allItems {
    display(item)
}

merge

merge menggabungkan beberapa sequence secara paralel — elemen dari manapun yang pertama tersedia akan langsung di-emit. Selesai saat semua sequence selesai.

swift
// merge: interleave dari multiple sources
let userNotifications = notificationStream()
let systemAlerts = alertStream()
let remoteMessages = messageStream()

// Proses semua event dari ketiga source dalam urutan kedatangan
for await event in merge(userNotifications, systemAlerts, remoteMessages) {
    await handleEvent(event)
}
// merge menjamin tidak ada event yang terlewat dari manapun

combineLatest

combineLatest mirip zip tapi tidak menunggu pasangan — setiap kali salah satu sequence menghasilkan nilai baru, tuple terbaru dari semua sequence di-emit. Berguna untuk state yang sering berubah.

swift
// combineLatest: emit setiap ada nilai baru dari salah satu source
let isLoggedIn = authStateStream()    // Bool stream
let userProfile = profileStream()     // User? stream
let connectionState = networkStream() // NetworkState stream

for await (loggedIn, profile, network) in combineLatest(isLoggedIn, userProfile, connectionState) {
    // Dipanggil setiap kali SALAH SATU berubah
    updateUI(loggedIn: loggedIn, profile: profile, network: network)
}

Perbedaan kunci:

  • zip: menunggu semua punya nilai baru → rate-limited ke yang paling lambat
  • combineLatest: emit setiap ada perubahan di mana saja → lebih responsif, tapi bisa emit lebih sering