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 {}