Creation
- just(x): emit one value then complete.
- of(a,b,...): emit each value then complete.
- from([a,b,...]): emit each element of a collection. (DetailVM uses this to fan-out episode URLs.)
- create { observer in ... }: wrap callbacks/delegates.
- deferred { ... }: build the Observable lazily at subscribe time.
- interval(.seconds(n), scheduler): tick every n seconds.
- timer(.seconds(n), scheduler): fire once after n.
Transform
- map { f($0) }: 1→1 transform of each element. (SearchVM uses .map { q, _ in q })
- compactMap { ... }: map then drop nils.
- flatMap { inner($0) }: turn each element into a stream and merge them (parallel). (DetailVM uses this to load episodes concurrently.)
- flatMapLatest { ... } (a.k.a. switchMap): like flatMap but cancels previous inner stream when a new one starts. (SearchVM for canceling stale searches.)
- concatMap { ... }: queue work sequentially (wait for previous to complete).
- scan(seed) { acc, next in ... }: running accumulator (like reduce but emits intermediates).
- toArray(): collect all elements into a single array (emits once). (DetailVM after parallel loads.)
Filtering
- filter { predicate($0) }: keep some values. (SearchVM drops empty query.)
- distinctUntilChanged(): drop repeats. (Prevents duplicate API hits on same query.)