1use crate::common::*;
2
3#[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}