Dart Stream: Как объединить испускаемые предметы, когда они недолговечны? - PullRequest
0 голосов
/ 05 февраля 2019

Давайте предположим, что у меня есть Stream<int> испускающие целые числа в разных дельтах времени, то есть от 5 мс до 1000 мс.

Когда дельта <= 50 мс, я хочу объединить их.например: </p>

3, (delta:100) 5, (delta:27) 6, (delta:976) 3

Я хочу потреблять: 3, 11 (объединено с использованием сложения), 3.

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете написать это достаточно легко сами:

Stream<int> debounce(
    Stream<int> source, Duration limit, int combine(int a, int b)) async* {
  int prev;
  var stopwatch;
  await for (var event in source) {
    if (stopwatch == null) {
      // First event.
      prev = event;
      stopwatch = Stopwatch()..start();
    } else {
      if (stopwatch.elapsed < limit) {
        prev = combine(prev, event);
      } else {
        yield prev;
        prev = event;
      }
      stopwatch.reset();
    }
  }
  // If any event, yield prev.
  if (stopwatch != null) yield prev;
}
0 голосов
/ 05 февраля 2019

Вы можете использовать потоковый преобразователь debounceBuffer из пакета stream_transform .

stream
  .transform(debounceBuffer(const Duration(milliseconds: 50)))
  .map((list) => list.fold(0, (t, e) => t + e))
...