kutil_std/iter/
first_last.rs

1use std::iter::*;
2
3//
4//  IterateWithFirstLast
5//
6
7/// [Iterator] providing first and last flags.
8#[derive(Clone, Debug)]
9pub struct IterateWithFirstLast<ItemT, IterableT>
10where
11    IterableT: IntoIterator<Item = ItemT>,
12{
13    iterator: Peekable<IterableT::IntoIter>,
14    first: bool,
15}
16
17impl<ItemT, IterableT> IterateWithFirstLast<ItemT, IterableT>
18where
19    IterableT: IntoIterator<Item = ItemT>,
20{
21    /// Constructor.
22    pub fn new(iterable: IterableT) -> Self {
23        Self { iterator: iterable.into_iter().peekable(), first: true }
24    }
25}
26
27impl<ItemT, IterableT> Iterator for IterateWithFirstLast<ItemT, IterableT>
28where
29    IterableT: IntoIterator<Item = ItemT>,
30{
31    type Item = (ItemT, bool, bool);
32
33    fn next(&mut self) -> Option<Self::Item> {
34        let first = if self.first {
35            self.first = false;
36            true
37        } else {
38            false
39        };
40
41        self.iterator.next().map(|item| (item, first, self.iterator.peek().is_none()))
42    }
43}
44
45//
46//  IterateWithFirst
47//
48
49/// [Iterator] providing first flag.
50#[derive(Clone, Debug)]
51pub struct IterateWithFirst<ItemT, IterableT>
52where
53    IterableT: IntoIterator<Item = ItemT>,
54{
55    iterator: IterableT::IntoIter,
56    first: bool,
57}
58
59impl<ItemT, IterableT> IterateWithFirst<ItemT, IterableT>
60where
61    IterableT: IntoIterator<Item = ItemT>,
62{
63    /// Constructor.
64    pub fn new(iterable: IterableT) -> Self {
65        Self { iterator: iterable.into_iter(), first: true }
66    }
67}
68
69impl<ItemT, IterableT> Iterator for IterateWithFirst<ItemT, IterableT>
70where
71    IterableT: IntoIterator<Item = ItemT>,
72{
73    type Item = (ItemT, bool);
74
75    fn next(&mut self) -> Option<Self::Item> {
76        let first = if self.first {
77            self.first = false;
78            true
79        } else {
80            false
81        };
82
83        self.iterator.next().map(|item| (item, first))
84    }
85}
86
87//
88//  IterateWithLast
89//
90
91/// [Iterator] providing last flag.
92#[derive(Clone, Debug)]
93pub struct IterateWithLast<ItemT, IterableT>
94where
95    IterableT: IntoIterator<Item = ItemT>,
96{
97    iterator: Peekable<IterableT::IntoIter>,
98}
99
100impl<ItemT, IterableT> IterateWithLast<ItemT, IterableT>
101where
102    IterableT: IntoIterator<Item = ItemT>,
103{
104    /// Constructor.
105    pub fn new(iterable: IterableT) -> Self {
106        Self { iterator: iterable.into_iter().peekable() }
107    }
108}
109
110impl<ItemT, IterableT> Iterator for IterateWithLast<ItemT, IterableT>
111where
112    IterableT: IntoIterator<Item = ItemT>,
113{
114    type Item = (ItemT, bool);
115
116    fn next(&mut self) -> Option<Self::Item> {
117        self.iterator.next().map(|item| (item, self.iterator.peek().is_none()))
118    }
119}