darkfi_sdk/
util.rs

1/* This file is part of DarkFi (https://dark.fi)
2 *
3 * Copyright (C) 2020-2025 Dyne.org foundation
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 */
18
19/// Extra methods for Iterator. Copied from [itertools](https://github.com/rust-itertools/itertools).
20///
21/// Licensed under MIT.
22pub trait Itertools: Iterator {
23    /// `.try_collect()` is more convenient way of writing
24    /// `.collect::<Result<_, _>>()`
25    ///
26    /// # Example
27    ///
28    /// ```
29    /// use std::{fs, io};
30    /// use itertools::Itertools;
31    ///
32    /// fn process_dir_entries(entries: &[fs::DirEntry]) {
33    ///     // ...
34    /// }
35    ///
36    /// fn do_stuff() -> std::io::Result<()> {
37    ///     let entries: Vec<_> = fs::read_dir(".")?.try_collect()?;
38    ///     process_dir_entries(&entries);
39    ///
40    ///     Ok(())
41    /// }
42    /// ```
43    fn try_collect<T, U, E>(self) -> Result<U, E>
44    where
45        Self: Sized + Iterator<Item = Result<T, E>>,
46        Result<U, E>: FromIterator<Result<T, E>>,
47    {
48        self.collect()
49    }
50}
51
52impl<T> Itertools for T where T: Iterator + ?Sized {}