1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use crate::path::PathItem;
use crate::point::Point;
pub struct Segments<I: Iterator<Item = PathItem>> {
loop_start: Option<Point>,
last: Point,
path_items: I,
}
impl<I: Iterator<Item = PathItem>> Segments<I> {
pub fn new(it: I) -> Self {
Segments {
loop_start: None,
last: Point(0.0, 0.0),
path_items: it,
}
}
}
impl<I: Iterator<Item = PathItem>> Iterator for Segments<I> {
type Item = (Point, Point);
fn next(&mut self) -> Option<Self::Item> {
match self.path_items.next() {
Some(PathItem::Line(l)) => {
if self.loop_start == None {
self.loop_start = Some(l.0);
}
self.last = l.1;
Some((l.0, l.1))
}
Some(PathItem::CloseAndJump) => {
self.loop_start = None;
self.next()
}
Some(PathItem::Jump) => {
let loop_start = self.loop_start.unwrap();
self.loop_start = None;
if loop_start == self.last {
self.next()
} else {
Some((self.last, loop_start))
}
}
None => {
if let Some(loop_start) = self.loop_start {
self.loop_start = None;
Some((self.last, loop_start))
} else {
None
}
}
_ => panic!(),
}
}
}