use foundation_core::valtron::ThreadedValue;
use super::traits::StateStoreStream;
use crate::core::errors::StorageError;
pub fn collect_first<T>(mut stream: StateStoreStream<T>) -> Result<Option<T>, StorageError> {
if let Some(item) = stream.next() {
match item {
ThreadedValue::Value(Ok(val)) => return Ok(Some(val)),
ThreadedValue::Value(Err(e)) => return Err(e),
ThreadedValue::Waiting => {}
}
}
Ok(None)
}
pub fn collect_all<T>(stream: StateStoreStream<T>) -> Result<Vec<T>, StorageError> {
let mut results = Vec::new();
for item in stream {
match item {
ThreadedValue::Value(Ok(val)) => results.push(val),
ThreadedValue::Value(Err(e)) => return Err(e),
ThreadedValue::Waiting => {}
}
}
Ok(results)
}
pub fn drive_to_completion(stream: StateStoreStream<()>) -> Result<(), StorageError> {
for item in stream {
match item {
ThreadedValue::Value(Ok(())) => {}
ThreadedValue::Value(Err(e)) => return Err(e),
ThreadedValue::Waiting => {}
}
}
Ok(())
}