collected/
last.rs

1use crate::common::*;
2
3/// A collection that takes the last item when collected or extended from an iterator.
4#[derive(Debug, Clone)]
5pub struct Last<T> {
6    inner: Option<T>,
7}
8
9impl<T> Last<T> {
10    pub fn get(&self) -> Option<&T> {
11        self.inner.as_ref()
12    }
13
14    pub fn into_inner(self) -> Option<T> {
15        self.inner
16    }
17}
18
19impl<T> Default for Last<T> {
20    fn default() -> Self {
21        Self { inner: None }
22    }
23}
24
25impl<A> FromIterator<A> for Last<A> {
26    fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self {
27        Self {
28            inner: iter.into_iter().last(),
29        }
30    }
31}
32
33impl<A> Extend<A> for Last<A> {
34    fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T) {
35        self.inner = iter.into_iter().last().or(self.inner.take());
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn last_test() {
45        {
46            let mut last: Last<_> = iter::empty().collect();
47            assert!(last.get() == None);
48
49            last.extend(0..10);
50            assert!(last.get() == Some(&9));
51        }
52
53        {
54            let mut last: Last<_> = (0..10).collect();
55            assert!(last.get() == Some(&9));
56
57            last.extend(10..20);
58            assert!(last.get() == Some(&19));
59
60            last.extend(iter::empty());
61            assert!(last.get() == Some(&19));
62        }
63    }
64}