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 lambatcombineLatest: emit setiap ada perubahan di mana saja → lebih responsif, tapi bisa emit lebih sering