Как написать генератор Rust, возвращающий поток async_std?

Скажем, у меня есть черта IMyWriter, у которой есть функция flush_to_disk, которая получает итератор частей для записи. Каждая написанная часть должна давать объект Result.

use async_trait::async_trait;
use async_std::prelude::StreamExt;

#[async_trait]
trait IMyWriter<'a> {
   async fn flush_to_disk<'b, 'c: 'a + 'b, Iter, Results>(&mut self, pieces: Iter) -> Results 
    where
      Iter: IntoIterator<Item = u64>,
      Results: StreamExt<Item=Result<(), std::io::Error>>;
}

У меня проблемы с отображением в реализации:

use async_std::io::File;
use async_trait::async_trait;

struct MyWriter {
    file: Mutex<File>;
}

#[async_trait]
impl IMyWriter for MyWriter {
   async fn flush_to_disk<'b, 'c: 'a + 'b, Iter, Results>(&mut self, pieces: Iter) -> Results 
    where
      Iter: IntoIterator<Item = u64>,
      Results: StreamExt<Item=Result<(), std::io::Error>> {
      pieces.into_iter().map(|piece| async {
         let f = self.file.lock().await;
         // Do I/O on file
         Ok()
      })
   }
}

Это явно жалуется:

type parameter `Results`, found struct `std::iter::Map`

Я не могу понять, как вернуть результаты для потока асинхронных записей, которые происходят.


person Vitali    schedule 05.12.2020    source источник
comment
comment
Я так не думаю. Я сделал ошибку при расшифровке кода. Отсутствует # [async_trait] (так что да, если вы попробуете это, как написано, оно не будет компилироваться). Исправляем это сейчас. Сам вопрос остается в силе. Как мне написать функцию Rust, которая возвращает Stream (я думаю, что асинхронная часть вторична, но это как раз то, что у меня было в коде, который я пишу).   -  person Vitali    schedule 06.12.2020
comment
О, и это больше похоже на stackoverflow.com/questions/58700741/, но есть решение для tokio, пока этот вопрос это своего рода для async_std (т.е. без использования разворачивания tokio).   -  person Vitali    schedule 06.12.2020
comment
По сути, ваша ошибка возникает из-за того, что вы возвращаете реализацию признака StreamExt, а не каждую реализацию признака StreamExt, поэтому универсальный тип не работает в этом ситуация (подумайте, если бы пользователь указал тип для универсального параметра Results, как бы вы могли его вернуть?). Обычно решение этой проблемы состоит в том, чтобы вернуть impl Trait из функции, однако это не разрешено в объявлениях признаков, а обходные пути описаны в вопросе, который я ранее отправил, поэтому, надеюсь, вы сможете найти тот, который соответствует вашим потребностям.   -  person Aplet123    schedule 06.12.2020
comment
Я думаю, что я слишком новичок, чтобы перейти от этого сообщения SO к этому конкретному варианту использования. Я пробовал несколько подходов, но не могу понять, как это сопоставить. Вы не могли бы предложить конкретное решение этой проблемы?   -  person Vitali    schedule 06.12.2020