1#![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}