Skip to main content

unflatten/
lib.rs

1//! # unflatten
2//!
3//! `unflatten` is a <sup>[joke of a]</sup> library which provides one thing:
4//!
5//! ```rust
6//! use unflatten::Unflatten;
7//!
8//! let option = Some("body once told me");
9//! let unflattened = option.unflatten();
10//!
11//! assert_eq!(unflattened, Some(Some("body once told me")));
12//! ```
13//!
14#![no_std]
15
16mod sealed {
17    pub trait Sealed {}
18}
19
20use sealed::Sealed;
21
22pub trait Unflatten: Sealed + Sized {
23    fn unflatten(self) -> Option<Self> {
24        Some(self)
25    }
26}
27
28impl<T>    Sealed for Option<T> {}
29impl<T> Unflatten for Option<T> {}
30
31#[cfg(test)]
32mod tests {
33    use super::Unflatten;
34
35    #[test]
36    fn unflattening_some_works() {
37        let x: Option<i32> = Some(1);
38
39        assert_eq!(x.unflatten(), Some(Some(1)));
40    }
41
42    #[test]
43    fn unflattening_none_works() {
44        let x: Option<i32> = None;
45
46        assert_eq!(x.unflatten(), Some(None));
47    }
48
49    #[test]
50    fn flattening_unflattened_some_returns_same() {
51        let x: Option<i32> = Some(1);
52
53        assert_eq!(x.unflatten().flatten(), x);
54    }
55
56    #[test]
57    fn flattening_unflattened_none_returns_same() {
58        let x: Option<i32> = None;
59
60        assert_eq!(x.unflatten().flatten(), x);
61    }
62
63    #[test]
64    fn unflattening_flattened_some_returns_same() {
65        let x: Option<Option<i32>> = Some(Some(1));
66
67        assert_eq!(x.flatten().unflatten(), x);
68    }
69}