Files
start-os/core/src/util/iter.rs
Aiden McClelland 96ae532879 Refactor/project structure (#3085)
* refactor project structure

* environment-based default registry

* fix tests

* update build container

* use docker platform for iso build emulation

* simplify compat

* Fix docker platform spec in run-compat.sh

* handle riscv compat

* fix bug with dep error exists attr

* undo removal of sorting

* use qemu for iso stage

---------

Co-authored-by: Mariusz Kogen <k0gen@pm.me>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
2025-12-22 13:39:38 -07:00

32 lines
915 B
Rust

pub trait TransposeResultIterExt: Sized {
type Ok: IntoIterator;
type Err;
fn transpose(self) -> TransposeResult<Self::Ok, Self::Err>;
}
impl<T: IntoIterator, E> TransposeResultIterExt for Result<T, E> {
type Ok = T;
type Err = E;
fn transpose(self) -> TransposeResult<T, E> {
TransposeResult(Some(self.map(|t| t.into_iter())))
}
}
pub struct TransposeResult<T: IntoIterator, E>(Option<Result<T::IntoIter, E>>);
impl<T, E> Iterator for TransposeResult<T, E>
where
T: IntoIterator,
{
type Item = Result<T::Item, E>;
fn next(&mut self) -> Option<Self::Item> {
if self.0.as_ref().map_or(true, |r| r.is_err()) {
self.0
.take()
.map(|e| Err(e.map_or_else(|e| e, |_| unreachable!())))
} else if let Some(Ok(res)) = &mut self.0 {
res.next().map(Ok)
} else {
None
}
}
}