1
1
use super :: data:: { Crate , CrateName , Data , Release , Version } ;
2
- use std:: { collections:: BTreeMap , fmt:: Debug } ;
2
+ use std:: {
3
+ cmp:: Ordering ,
4
+ collections:: { btree_map:: IntoIter , BTreeMap } ,
5
+ fmt:: Debug ,
6
+ iter:: Peekable ,
7
+ } ;
3
8
4
9
#[ derive( Debug ) ]
5
10
pub ( crate ) struct DataDiff {
6
- pub ( crate ) crates : CratesDiff ,
11
+ pub ( crate ) crates : DiffMap < CrateName , Crate > ,
7
12
}
8
13
9
- pub ( crate ) type CratesDiff = impl Iterator < Item = Diff < CrateName , Crate > > + Debug ;
10
-
11
14
#[ derive( Debug ) ]
12
15
pub ( crate ) struct CrateDiff {
13
- pub ( crate ) releases : ReleasesDiff ,
16
+ pub ( crate ) releases : DiffMap < Version , Release > ,
14
17
}
15
18
16
- pub ( crate ) type ReleasesDiff = impl Iterator < Item = Diff < Version , Release > > + Debug ;
17
-
18
19
#[ derive( Debug ) ]
19
20
pub ( crate ) struct ReleaseDiff { }
20
21
@@ -30,69 +31,60 @@ pub(crate) trait Diffable {
30
31
fn diff ( self , other : Self ) -> Self :: Diff ;
31
32
}
32
33
33
- fn diff_map < Key : Ord + Debug , Value : Diffable + Debug > (
34
- left : BTreeMap < Key , Value > ,
35
- right : BTreeMap < Key , Value > ,
36
- ) -> impl Iterator < Item = Diff < Key , Value > > + Debug {
37
- use std :: { cmp :: Ordering , collections :: btree_map :: IntoIter , iter :: Peekable } ;
34
+ # [ derive ( Debug ) ]
35
+ pub ( crate ) struct DiffMap < Key , Value > {
36
+ left : Peekable < std :: collections :: btree_map :: IntoIter < Key , Value > > ,
37
+ right : Peekable < IntoIter < Key , Value > > ,
38
+ }
38
39
39
- #[ derive( Debug ) ]
40
- struct DiffMap < Key , Value > {
41
- left : Peekable < std:: collections:: btree_map:: IntoIter < Key , Value > > ,
42
- right : Peekable < IntoIter < Key , Value > > ,
40
+ impl < Key , Value > DiffMap < Key , Value > {
41
+ fn new ( left : BTreeMap < Key , Value > , right : BTreeMap < Key , Value > ) -> Self {
42
+ Self {
43
+ left : left. into_iter ( ) . peekable ( ) ,
44
+ right : right. into_iter ( ) . peekable ( ) ,
45
+ }
43
46
}
47
+ }
48
+
49
+ impl < Key : Ord , Value : Diffable > Iterator for DiffMap < Key , Value > {
50
+ type Item = Diff < Key , Value > ;
44
51
45
- impl < Key : Ord , Value : Diffable > Iterator for DiffMap < Key , Value > {
46
- type Item = Diff < Key , Value > ;
47
-
48
- fn next ( & mut self ) -> Option < Self :: Item > {
49
- match ( self . left . peek ( ) , self . right . peek ( ) ) {
50
- ( Some ( ( left, _) ) , Some ( ( right, _) ) ) => match left. cmp ( right) {
51
- Ordering :: Less => {
52
- let ( key, value) = self . left . next ( ) . unwrap ( ) ;
53
- Some ( Diff :: Left ( key, value) )
54
- }
55
- Ordering :: Equal => {
56
- let ( key, left) = self . left . next ( ) . unwrap ( ) ;
57
- let ( _, right) = self . right . next ( ) . unwrap ( ) ;
58
- Some ( Diff :: Both ( key, left. diff ( right) ) )
59
- }
60
- Ordering :: Greater => {
61
- let ( key, value) = self . right . next ( ) . unwrap ( ) ;
62
- Some ( Diff :: Right ( key, value) )
63
- }
64
- } ,
65
- ( Some ( ( _, _) ) , None ) => {
52
+ fn next ( & mut self ) -> Option < Self :: Item > {
53
+ match ( self . left . peek ( ) , self . right . peek ( ) ) {
54
+ ( Some ( ( left, _) ) , Some ( ( right, _) ) ) => match left. cmp ( right) {
55
+ Ordering :: Less => {
66
56
let ( key, value) = self . left . next ( ) . unwrap ( ) ;
67
57
Some ( Diff :: Left ( key, value) )
68
58
}
69
- ( None , Some ( ( _, _) ) ) => {
59
+ Ordering :: Equal => {
60
+ let ( key, left) = self . left . next ( ) . unwrap ( ) ;
61
+ let ( _, right) = self . right . next ( ) . unwrap ( ) ;
62
+ Some ( Diff :: Both ( key, left. diff ( right) ) )
63
+ }
64
+ Ordering :: Greater => {
70
65
let ( key, value) = self . right . next ( ) . unwrap ( ) ;
71
66
Some ( Diff :: Right ( key, value) )
72
67
}
73
- ( None , None ) => None ,
68
+ } ,
69
+ ( Some ( ( _, _) ) , None ) => {
70
+ let ( key, value) = self . left . next ( ) . unwrap ( ) ;
71
+ Some ( Diff :: Left ( key, value) )
72
+ }
73
+ ( None , Some ( ( _, _) ) ) => {
74
+ let ( key, value) = self . right . next ( ) . unwrap ( ) ;
75
+ Some ( Diff :: Right ( key, value) )
74
76
}
77
+ ( None , None ) => None ,
75
78
}
76
79
}
77
-
78
- DiffMap {
79
- left : left. into_iter ( ) . peekable ( ) ,
80
- right : right. into_iter ( ) . peekable ( ) ,
81
- }
82
80
}
83
81
84
82
impl Diffable for Data {
85
83
type Diff = DataDiff ;
86
84
87
85
fn diff ( self , other : Self ) -> Self :: Diff {
88
- fn diff_crates (
89
- left : BTreeMap < CrateName , Crate > ,
90
- right : BTreeMap < CrateName , Crate > ,
91
- ) -> CratesDiff {
92
- diff_map ( left, right)
93
- }
94
86
DataDiff {
95
- crates : diff_crates ( self . crates , other. crates ) ,
87
+ crates : DiffMap :: new ( self . crates , other. crates ) ,
96
88
}
97
89
}
98
90
}
@@ -101,14 +93,8 @@ impl Diffable for Crate {
101
93
type Diff = CrateDiff ;
102
94
103
95
fn diff ( self , other : Self ) -> Self :: Diff {
104
- fn diff_releases (
105
- left : BTreeMap < Version , Release > ,
106
- right : BTreeMap < Version , Release > ,
107
- ) -> ReleasesDiff {
108
- diff_map ( left, right)
109
- }
110
96
CrateDiff {
111
- releases : diff_releases ( self . releases , other. releases ) ,
97
+ releases : DiffMap :: new ( self . releases , other. releases ) ,
112
98
}
113
99
}
114
100
}
0 commit comments