graph_api_lib/walker/steps/
into_iter.rs1use crate::walker::builder::{EdgeWalkerBuilder, VertexWalkerBuilder};
2use crate::walker::{EdgeWalker, VertexWalker};
3use include_doc::function_body;
4
5#[doc = function_body!("examples/into_iter.rs", example, [])]
52impl<'graph, Mutability, Graph, Walker> IntoIterator
63 for VertexWalkerBuilder<'graph, Mutability, Graph, Walker>
64where
65 Graph: crate::graph::Graph,
66 Walker: VertexWalker<'graph, Graph = Graph>,
67{
68 type Item = Graph::VertexId;
69 type IntoIter = VertexIterImpl<'graph, Graph, Walker>;
70
71 fn into_iter(mut self) -> Self::IntoIter {
72 VertexIterImpl::new(self.graph(), self.walker())
73 }
74}
75
76impl<'graph, Mutability, Graph, Walker> IntoIterator
77 for EdgeWalkerBuilder<'graph, Mutability, Graph, Walker>
78where
79 Graph: crate::graph::Graph,
80 Walker: EdgeWalker<'graph, Graph = Graph>,
81{
82 type Item = Graph::EdgeId;
83 type IntoIter = EdgeIterImpl<'graph, Graph, Walker>;
84
85 fn into_iter(mut self) -> Self::IntoIter {
86 EdgeIterImpl::new(self.graph(), self.walker())
87 }
88}
89
90pub struct VertexReferenceIterImpl<'graph, Graph, Walker> {
91 graph: &'graph Graph,
92 walker: Walker,
93}
94
95impl<'graph, Graph, Walker> VertexReferenceIterImpl<'graph, Graph, Walker> {
96 pub(crate) fn new(graph: &'graph Graph, walker: Walker) -> Self
97 where
98 Graph: crate::graph::Graph,
99 Walker: VertexWalker<'graph, Graph = Graph>,
100 {
101 Self { graph, walker }
102 }
103}
104
105impl<'graph, Graph, Walker> Iterator for VertexReferenceIterImpl<'graph, Graph, Walker>
106where
107 Graph: crate::graph::Graph,
108 Walker: VertexWalker<'graph, Graph = Graph>,
109{
110 type Item = (Graph::VertexReference<'graph>, Walker::Context);
111
112 fn next(&mut self) -> Option<Self::Item> {
113 if let Some(next) = self.walker.next(self.graph) {
114 Some((
115 self.graph
116 .vertex(next)
117 .expect("vertex ID must resolve to vertex"),
118 self.walker.ctx().clone(),
119 ))
120 } else {
121 None
122 }
123 }
124}
125
126pub struct EdgeReferenceIterImpl<'graph, Graph, Walker> {
127 graph: &'graph Graph,
128 walker: Walker,
129}
130
131impl<'graph, Graph, Walker> EdgeReferenceIterImpl<'graph, Graph, Walker> {
132 pub(crate) fn new(graph: &'graph Graph, walker: Walker) -> Self
133 where
134 Graph: crate::graph::Graph,
135 Walker: EdgeWalker<'graph, Graph = Graph>,
136 {
137 Self { graph, walker }
138 }
139}
140
141impl<'graph, Graph, Walker> Iterator for EdgeReferenceIterImpl<'graph, Graph, Walker>
142where
143 Graph: crate::graph::Graph,
144 Walker: EdgeWalker<'graph, Graph = Graph>,
145{
146 type Item = (Graph::EdgeReference<'graph>, Walker::Context);
147
148 fn next(&mut self) -> Option<Self::Item> {
149 if let Some(next) = self.walker.next(self.graph) {
150 let edge = self
151 .graph
152 .edge(next)
153 .expect("edge ID must resolve to an edge");
154 Some((edge, self.walker.ctx().clone()))
155 } else {
156 None
157 }
158 }
159}
160
161pub struct VertexIterImpl<'graph, Graph, Walker> {
162 graph: &'graph Graph,
163 walker: Walker,
164}
165
166impl<'graph, Graph, Walker> VertexIterImpl<'graph, Graph, Walker> {
167 pub(crate) fn new(graph: &'graph Graph, walker: Walker) -> Self
168 where
169 Graph: crate::graph::Graph,
170 Walker: VertexWalker<'graph, Graph = Graph>,
171 {
172 Self { graph, walker }
173 }
174}
175
176impl<'graph, Graph, Walker> Iterator for VertexIterImpl<'graph, Graph, Walker>
177where
178 Graph: crate::graph::Graph,
179 Walker: VertexWalker<'graph, Graph = Graph>,
180{
181 type Item = Graph::VertexId;
182
183 fn next(&mut self) -> Option<Self::Item> {
184 self.walker.next(self.graph)
185 }
186}
187
188pub struct EdgeIterImpl<'graph, Graph, Walker> {
189 graph: &'graph Graph,
190 walker: Walker,
191}
192
193impl<'graph, Graph, Walker> EdgeIterImpl<'graph, Graph, Walker> {
194 pub(crate) fn new(graph: &'graph Graph, walker: Walker) -> Self
195 where
196 Graph: crate::graph::Graph,
197 Walker: EdgeWalker<'graph, Graph = Graph>,
198 {
199 Self { graph, walker }
200 }
201}
202
203impl<'graph, Graph, Walker> Iterator for EdgeIterImpl<'graph, Graph, Walker>
204where
205 Graph: crate::graph::Graph,
206 Walker: EdgeWalker<'graph, Graph = Graph>,
207{
208 type Item = Graph::EdgeId;
209
210 fn next(&mut self) -> Option<Self::Item> {
211 self.walker.next(self.graph)
212 }
213}