1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//! Transform nested container types in Rust.
//!
//! The crate provides the `.transpose()` and `.flatten()` on nested container types.
//!
//! `.transpose()` exchanges the inner and outer containers types. For example,
//! - `Vec<Vec<T>>` -> `Option<Vec<Vec<T>>>`
//! - `Vec<HashMap<K, V>>` -> `Option<HashMap<K, Vec<V>>>`
//! - `HashMap<K, Vec<V>>` -> `HashMap<K, Vec<V>>`
//! - `Result<Result<T, E>, F>` -> `Result<Result<T, F>, E>`
//! - `Option<Option<T>>` -> `Option<Option<T>>`
//!
//! `.flatten()` merges the inner and outer container types. For example,
//! - `Vec<Vec<T>>` -> `Vec<T>`
//! - `HashMap<K, HashMap<L, V>>` -> `HashMap<(K, L), V>`
//! - `HashMap<K, Vec<V>>` -> `HashMap<(K, usize), V>`
//! - `Vec<HashMap<K, V>>` -> `HashMap<(usize, K), V>`
//!
//! This is an example usage of `.transpose` and `.flatten()`.
//!
//! ```rust
//! use mona::prelude::*;
//!
//! let vec_of_vec = vec![vec![1, 2, 3], vec![4, 5, 6]];
//!
//! assert_eq!(
//!     vec_of_vec.clone().transpose(),
//!     Some(vec![vec![1, 4], vec![2, 5], vec![3, 6]])
//! );
//!
//! assert_eq!(vec_of_vec.flatten(), vec![1, 2, 3, 4, 5, 6]);
//! ```

mod common;
mod flatten;
mod transpose;

pub use flatten::*;
pub use transpose::*;

pub mod prelude {
    pub use crate::{Flatten, Transpose};
}