@@ -76,37 +76,107 @@ pub type EdgeRemoval = EdgeDifference<Removal>;
7676/// Manages iteration over trees to obtain
7777/// edge differences.
7878pub struct EdgeDifferencesIterator < ' ts > {
79- edge_left : & ' ts [ Position ] ,
80- edge_right : & ' ts [ Position ] ,
81- edge_parent : & ' ts [ NodeId ] ,
82- edge_child : & ' ts [ NodeId ] ,
79+ edges_left : & ' ts [ Position ] ,
80+ edges_right : & ' ts [ Position ] ,
81+ edges_parent : & ' ts [ NodeId ] ,
82+ edges_child : & ' ts [ NodeId ] ,
8383 insertion_order : & ' ts [ EdgeId ] ,
84- removal_orderr : & ' ts [ EdgeId ] ,
84+ removal_order : & ' ts [ EdgeId ] ,
8585 left : f64 ,
86+ sequence_length : f64 ,
87+ insertion_index : usize ,
88+ removal_index : usize ,
8689}
8790
8891impl < ' ts > EdgeDifferencesIterator < ' ts > {
8992 pub ( crate ) fn new ( treeseq : & ' ts TreeSequence ) -> Self {
9093 Self {
91- edge_left : treeseq. tables ( ) . edges ( ) . left_slice ( ) ,
92- edge_right : treeseq. tables ( ) . edges ( ) . right_slice ( ) ,
93- edge_parent : treeseq. tables ( ) . edges ( ) . parent_slice ( ) ,
94- edge_child : treeseq. tables ( ) . edges ( ) . child_slice ( ) ,
94+ edges_left : treeseq. tables ( ) . edges ( ) . left_slice ( ) ,
95+ edges_right : treeseq. tables ( ) . edges ( ) . right_slice ( ) ,
96+ edges_parent : treeseq. tables ( ) . edges ( ) . parent_slice ( ) ,
97+ edges_child : treeseq. tables ( ) . edges ( ) . child_slice ( ) ,
9598 insertion_order : treeseq. edge_insertion_order ( ) ,
96- removal_orderr : treeseq. edge_removal_order ( ) ,
99+ removal_order : treeseq. edge_removal_order ( ) ,
97100 left : 0. ,
101+ sequence_length : treeseq. tables ( ) . sequence_length ( ) . into ( ) ,
102+ insertion_index : 0 ,
103+ removal_index : 0 ,
98104 }
99105 }
100106}
101107
102108pub struct EdgeDifferences < ' ts > {
103- marker : std:: marker:: PhantomData < & ' ts ( ) > ,
109+ edges_left : & ' ts [ Position ] ,
110+ edges_right : & ' ts [ Position ] ,
111+ edges_parent : & ' ts [ NodeId ] ,
112+ edges_child : & ' ts [ NodeId ] ,
113+ removals : ( usize , usize ) ,
114+ insertions : ( usize , usize ) ,
115+ left : f64 ,
116+ right : f64 ,
117+ }
118+
119+ fn update_right (
120+ right : f64 ,
121+ index : usize ,
122+ position_slice : & [ Position ] ,
123+ diff_slice : & [ EdgeId ] ,
124+ ) -> f64 {
125+ if index < diff_slice. len ( ) {
126+ let temp = position_slice[ diff_slice[ index] . as_usize ( ) ] ;
127+ if temp < right {
128+ temp. into ( )
129+ } else {
130+ right
131+ }
132+ } else {
133+ right
134+ }
104135}
105136
106137impl < ' ts > Iterator for EdgeDifferencesIterator < ' ts > {
107138 type Item = EdgeDifferences < ' ts > ;
108139
109140 fn next ( & mut self ) -> Option < Self :: Item > {
110- todo ! ( )
141+ if self . insertion_index < self . insertion_order . len ( ) && self . left < self . sequence_length {
142+ let removals_start = self . removal_index ;
143+ while self . removal_index < self . removal_order . len ( )
144+ && self . edges_right [ self . removal_index ] == self . left
145+ {
146+ self . removal_index += 1 ;
147+ }
148+ let right = update_right (
149+ self . sequence_length ,
150+ self . insertion_index ,
151+ self . edges_left ,
152+ self . insertion_order ,
153+ ) ;
154+ let right = update_right (
155+ right,
156+ self . removal_index ,
157+ self . edges_right ,
158+ self . removal_order ,
159+ ) ;
160+ let insertions_start = self . insertion_index ;
161+ while self . insertion_index < self . insertion_order . len ( )
162+ && self . edges_left [ self . insertion_index ] == self . left
163+ {
164+ self . insertion_index += 1 ;
165+ }
166+ let diffs = EdgeDifferences {
167+ edges_left : self . edges_left ,
168+ edges_right : self . edges_right ,
169+ edges_parent : self . edges_parent ,
170+ edges_child : self . edges_child ,
171+ removals : ( removals_start, self . removal_index ) ,
172+ insertions : ( insertions_start, self . insertion_index ) ,
173+ left : self . left ,
174+ right,
175+ } ;
176+ self . left = right;
177+ Some ( diffs)
178+ } else {
179+ None
180+ }
111181 }
112182}
0 commit comments