# combine-latest Combines two streams into a new stream which yields tuples with the latest values from each input stream. Inspired by Rx's combineLatest. ```rust use async_stream::stream; use combine_latest::combine_latest; fn combine_weather_data_streams( temperature: impl Stream, weather_notes: impl Stream, ) -> Stream { stream! { for await (t, n) in combine_latest(temperature, weather_notes) { yield format!("Temperature {t}°, note: {n}"); } } } ``` `combine_latest` won't yield its first tuple until both input streams have yielded a value. If you need to get items as soon as the first is available, there is a `combine_latest_opt` function that yields `(Option, Option)` tuples. As values come in over time on the `temperature` and `weather_notes` streams, `combine_latest` and `combine_latest_opt` will yield values like so: |time| temperature | weather_notes | combine_latest | combine_latest_opt | |----|--------------|----------------|------------------------|------------------------------------| | 0 | 25 | | | (Some(25), None) | | 1 | 26 | | | (Some(26), None) | | 2 | | Low visibility | (26, "Low visibility") | (Some(26), Some("Low visibility")) | | 3 | | Foggy | (26, "Foggy") | (Some(26), Some("Foggy")) | | 4 | 25 | | (25, "Foggy") | (Some(25), Some("Foggy")) | Since the same input value might be returned several times in the output stream, the items that the input streams yield *must implement Clone.* For types that don't implement Clone, it's possible to use the function `map_latest`: ```rust fn combine_weather_data_streams( temperature: impl Stream, weather_notes: impl Stream, ) -> Stream { stream! { for await output in map_latest( temperature, weather_notes, |t, n| format!("Temperature {t}°, note: {n}"), ) { yield output; } } } ``` To add to you project: `cargo add combine-latest`