import 'backpressure.dart'; import 'timer_stream.dart'; /// create by 张风捷特烈 on 2020/11/17 /// contact me by email 1981462002@qq.com /// 说明: /// Transforms a [Stream] so that will only emit items from the source sequence /// if a window has completed, without the source sequence emitting /// another item. /// /// This window is created after the last debounced event was emitted. /// You can use the value of the last debounced event to determine /// the length of the next window. /// /// A window is open until the first window event emits. /// /// The debounce [StreamTransformer] filters out items emitted by the source /// Stream that are rapidly followed by another emitted item. /// /// [Interactive marble diagram](http://rxmarbles.com/#debounce) /// /// ### Example /// /// Stream.fromIterable([1, 2, 3, 4]) /// .debounceTime(Duration(seconds: 1)) /// .listen(print); // prints 4 class DebounceStreamTransformer extends BackpressureStreamTransformer { /// Constructs a [StreamTransformer] which buffers events into a [List] and /// emits this [List] whenever the current [window] fires. /// /// The [window] is reset whenever the [Stream] that is being transformed /// emits an event. DebounceStreamTransformer(Stream Function(T event) window) : super(WindowStrategy.everyEvent, window, onWindowEnd: (Iterable queue) => queue.last) { assert(window != null, 'window stream factory cannot be null'); } } /// Extends the Stream class with the ability to debounce events in various ways extension DebounceExtensions on Stream { /// Transforms a [Stream] so that will only emit items from the source sequence /// if a [window] has completed, without the source sequence emitting /// another item. /// /// This [window] is created after the last debounced event was emitted. /// You can use the value of the last debounced event to determine /// the length of the next [window]. /// /// A [window] is open until the first [window] event emits. /// /// debounce filters out items emitted by the source [Stream] /// that are rapidly followed by another emitted item. /// /// [Interactive marble diagram](http://rxmarbles.com/#debounce) /// /// ### Example /// /// Stream.fromIterable([1, 2, 3, 4]) /// .debounce((_) => TimerStream(true, Duration(seconds: 1))) /// .listen(print); // prints 4 Stream debounce(Stream Function(T event) window) => transform(DebounceStreamTransformer(window)); /// Transforms a [Stream] so that will only emit items from the source /// sequence whenever the time span defined by [duration] passes, without the /// source sequence emitting another item. /// /// This time span start after the last debounced event was emitted. /// /// debounceTime filters out items emitted by the source [Stream] that are /// rapidly followed by another emitted item. /// /// [Interactive marble diagram](http://rxmarbles.com/#debounceTime) /// /// ### Example /// /// Stream.fromIterable([1, 2, 3, 4]) /// .debounceTime(Duration(seconds: 1)) /// .listen(print); // prints 4 Stream debounceTime(Duration duration) => transform( DebounceStreamTransformer((_) => TimerStream(true, duration))); }