| [](https://github.com/dart-lang/tools/actions/workflows/stream_transform.yaml) |
| [](https://pub.dev/packages/stream_transform) |
| [](https://pub.dev/packages/stream_transform/publisher) |
| |
| Extension methods on `Stream` adding common transform operators. |
| |
| ## Operators |
| |
| ### asyncMapBuffer, asyncMapSample, concurrentAsyncMap |
| |
| Alternatives to `asyncMap`. `asyncMapBuffer` prevents the callback from |
| overlapping execution and collects events while it is executing. |
| `asyncMapSample` prevents overlapping execution and discards events while it is |
| executing. `concurrentAsyncMap` allows overlap and removes ordering guarantees |
| for higher throughput. |
| |
| Like `asyncMap` but events are buffered in a List until previous events have |
| been processed rather than being called for each element individually. |
| |
| ### asyncWhere |
| |
| Like `where` but allows an asynchronous predicate. |
| |
| ### audit |
| |
| Waits for a period of time after receiving a value and then only emits the most |
| recent value. |
| |
| ### buffer |
| |
| Collects values from a source stream until a `trigger` stream fires and the |
| collected values are emitted. |
| |
| ### combineLatest, combineLatestAll |
| |
| Combine the most recent event from multiple streams through a callback or into a |
| list. |
| |
| ### debounce, debounceBuffer |
| |
| Prevents a source stream from emitting too frequently by dropping or collecting |
| values that occur within a given duration. |
| |
| ### followedBy |
| |
| Appends the values of a stream after another stream finishes. |
| |
| ### merge, mergeAll, concurrentAsyncExpand |
| |
| Interleaves events from multiple streams into a single stream. |
| |
| ### scan |
| |
| Scan is like fold, but instead of producing a single value it yields each |
| intermediate accumulation. |
| |
| ### startWith, startWithMany, startWithStream |
| |
| Prepend a value, an iterable, or a stream to the beginning of another stream. |
| |
| ### switchMap, switchLatest |
| |
| Flatten a Stream of Streams into a Stream which forwards values from the most |
| recent Stream |
| |
| ### takeUntil |
| |
| Let values through until a Future fires. |
| |
| ### tap |
| |
| Taps into a single-subscriber stream to react to values as they pass, without |
| being a real subscriber. |
| |
| ### throttle |
| |
| Blocks events for a duration after an event is successfully emitted. |
| |
| ### whereType |
| |
| Like `Iterable.whereType` for a stream. |
| |
| ## Comparison to Rx Operators |
| |
| The semantics and naming in this package have some overlap, and some conflict, |
| with the [ReactiveX](https://reactivex.io/) suite of libraries. Some of the |
| conflict is intentional - Dart `Stream` predates `Observable` and coherence with |
| the Dart ecosystem semantics and naming is a strictly higher priority than |
| consistency with ReactiveX. |
| |
| Rx Operator Category | variation | `stream_transform` |
| ------------------------- | ------------------------------------------------------ | ------------------ |
| [`sample`][rx_sample] | `sample/throttleLast(Duration)` | `sample(Stream.periodic(Duration), longPoll: false)` |
| ​ | `throttleFirst(Duration)` | [`throttle`][throttle] |
| ​ | `sample(Observable)` | `sample(trigger, longPoll: false)` |
| [`debounce`][rx_debounce] | `debounce/throttleWithTimeout(Duration)` | [`debounce`][debounce] |
| ​ | `debounce(Observable)` | No equivalent |
| [`buffer`][rx_buffer] | `buffer(boundary)`, `bufferWithTime`,`bufferWithCount` | No equivalent |
| ​ | `buffer(boundaryClosingSelector)` | `buffer(trigger, longPoll: false)` |
| RxJs extensions | [`audit(callback)`][rxjs_audit] | No equivalent |
| ​ | [`auditTime(Duration)`][rxjs_auditTime] | [`audit`][audit] |
| ​ | [`exhaustMap`][rxjs_exhaustMap] | No equivalent |
| ​ | [`throttleTime(trailing: true)`][rxjs_throttleTime] | `throttle(trailing: true)` |
| ​ | `throttleTime(leading: false, trailing: true)` | No equivalent |
| No equivalent? | | [`asyncMapBuffer`][asyncMapBuffer] |
| ​ | | [`asyncMapSample`][asyncMapSample] |
| ​ | | [`buffer`][buffer] |
| ​ | | [`sample`][sample] |
| ​ | | [`debounceBuffer`][debounceBuffer] |
| ​ | | `debounce(leading: true, trailing: false)` |
| ​ | | `debounce(leading: true, trailing: true)` |
| |
| [rx_sample]:https://reactivex.io/documentation/operators/sample.html |
| [rx_debounce]:https://reactivex.io/documentation/operators/debounce.html |
| [rx_buffer]:https://reactivex.io/documentation/operators/buffer.html |
| [rxjs_audit]:https://rxjs.dev/api/operators/audit |
| [rxjs_auditTime]:https://rxjs.dev/api/operators/auditTime |
| [rxjs_throttleTime]:https://rxjs.dev/api/operators/throttleTime |
| [rxjs_exhaustMap]:https://rxjs.dev/api/operators/exhaustMap |
| [asyncMapBuffer]:https://pub.dev/documentation/stream_transform/latest/stream_transform/AsyncMap/asyncMapBuffer.html |
| [asyncMapSample]:https://pub.dev/documentation/stream_transform/latest/stream_transform/AsyncMap/asyncMapSample.html |
| [audit]:https://pub.dev/documentation/stream_transform/latest/stream_transform/RateLimit/audit.html |
| [buffer]:https://pub.dev/documentation/stream_transform/latest/stream_transform/RateLimit/buffer.html |
| [sample]:https://pub.dev/documentation/stream_transform/latest/stream_transform/RateLimit/sample.html |
| [debounceBuffer]:https://pub.dev/documentation/stream_transform/latest/stream_transform/RateLimit/debounceBuffer.html |
| [debounce]:https://pub.dev/documentation/stream_transform/latest/stream_transform/RateLimit/debounce.html |
| [throttle]:https://pub.dev/documentation/stream_transform/latest/stream_transform/RateLimit/throttle.html |
| |
| ## Getting a `StreamTransformer` instance |
| |
| It may be useful to pass an instance of `StreamTransformer` so that it can be |
| used with `stream.transform` calls rather than reference the specific operator |
| in place. Any operator on `Stream` that returns a `Stream` can be modeled as a |
| `StreamTransformer` using the [`fromBind` constructor][fromBind]. |
| |
| ```dart |
| final debounce = StreamTransformer.fromBind( |
| (s) => s.debounce(const Duration(milliseconds: 100))); |
| ``` |
| |
| [fromBind]: https://api.dart.dev/stable/dart-async/StreamTransformer/StreamTransformer.fromBind.html |