Применение оконной функции к потоку Dart

Я новичок в Dart и все еще сижу с ума от потоков. В частности, мне трудно найти правильный способ создания функции, которая берет окно из N элементов из потока, применяет к нему функцию и повторно передает результаты.

Чтобы прояснить, что я имею в виду, я привожу пример, который я реализовал сам и который привел меня к этому вопросу. Код берет байтовый поток из файла и преобразует 4-байтовые блоки в целочисленный поток. Используя await for, я смог выполнить то, что хотел, но я ищу более идиоматическую потоковую функцию, которая выполняет то же самое, более кратко.

Stream<int> loadData(String path) async* {
  final f = File(path);
  final byteStream = f.openRead();
  var buffer = Uint8List(8);
  var i = 0;
  
  // This is where I would like to use a windowing function
  await for(var bs in byteStream) {
    for(var b in bs) {
      buffer[i++] = b;
      if(i == 8)  {
        var bytes = new ByteData.view(buffer.buffer);
        yield bytes.getUint16(0);
        i = 0;
      }
    }
  }
}

person Gerard    schedule 23.01.2021    source источник


Ответы (1)


Посмотрите на метод bufferCount из пакет RxDart.

Буферизует ряд значений из исходного потока по счетчику, затем испускает буфер, очищает его и запускает новый буфер ...

Вот пример:

import 'dart:typed_data';

import 'package:rxdart/rxdart.dart';

main() {
  var bytes = Uint8List.fromList([255, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 2, 1, 0, 0]);
  Stream<int>.fromIterable(bytes)
      .bufferCount(4)
      .map((bytes) => Uint8List.fromList(bytes).buffer)
      .map((buffer) => ByteData.view(buffer).getInt32(0, Endian.little))
      .listen(print); // prints 255 256 257 258
}

Стоит отметить, что именно эту задачу можно выполнить намного проще:

    bytes.buffer.asInt32List();
person Spatz    schedule 02.02.2021
comment
Ах, умно, да, я искал общее решение, которое бы открывало окно, надеюсь, что-нибудь в стандартной библиотеке dart, но я думаю, что bufferCount rxdart - это самое близкое к оконной функции. Спасибо также за добавленный совет о asInt32List, ура! - person Gerard; 04.02.2021