combine-patternslisted
Install: claude install-skill Mattakushi432/Claude-Code-Skills-Custom-DevTools-Pack
# Combine Patterns
## Core Concepts
```swift
import Combine
// Subject — imperative publisher you push values into
let subject = PassthroughSubject<String, Never>()
// CurrentValueSubject — stores latest value, replays to new subscribers
let state = CurrentValueSubject<Bool, Never>(false)
// Subscription — always store to prevent cancellation
var cancellables = Set<AnyCancellable>()
subject
.filter { !$0.isEmpty }
.map { $0.uppercased() }
.sink { print($0) }
.store(in: &cancellables)
subject.send("hello") // prints "HELLO"
```
## Search with Debounce
```swift
class SearchViewModel: ObservableObject {
@Published var query = ""
@Published private(set) var results: [Result] = []
private var cancellables = Set<AnyCancellable>()
init(service: SearchService) {
$query
.debounce(for: .milliseconds(300), scheduler: DispatchQueue.main)
.removeDuplicates()
.filter { $0.count >= 2 }
.flatMap { query in
Future<[Result], Never> { promise in
Task {
let r = (try? await service.search(query)) ?? []
promise(.success(r))
}
}
}
.receive(on: DispatchQueue.main)
.assign(to: \.results, on: self)
.store(in: &cancellables)
}
}
```
## Combining Publishers
```swift
// zip — pairs elements from two publishers
Publishers.Zip(userPublis