kutil_std/iter/
first_last.rs1use std::iter::*;
2
3#[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 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#[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 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#[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 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}