@@ -146,7 +146,7 @@ impl<'a> Builder<'a> {
146
146
fn path_length ( & self , path : & [ Path ] ) -> Option < Rc < Expression > > {
147
147
let mut len: Option < Rc < Expression > > = None ;
148
148
149
- let mut vars: HashMap < String , Rc < Expression > > = HashMap :: new ( ) ;
149
+ let mut vars: HashMap < & str , Rc < Expression > > = HashMap :: new ( ) ;
150
150
151
151
for elem in path {
152
152
for action in self . nfa . verts [ elem. from ] . edges [ elem. edge_no ]
@@ -156,11 +156,7 @@ impl<'a> Builder<'a> {
156
156
{
157
157
match action {
158
158
Action :: Gap { length, .. } | Action :: Flash { length, .. } => {
159
- let length = if let Expression :: Identifier ( id) = length. as_ref ( ) {
160
- vars. get ( id) . unwrap_or ( length) . clone ( )
161
- } else {
162
- length. clone ( )
163
- } ;
159
+ let length = replace_vars ( length, & vars) ;
164
160
165
161
if let Some ( prev) = len {
166
162
if let ( Expression :: Number ( left) , Expression :: Number ( right) ) =
@@ -176,17 +172,9 @@ impl<'a> Builder<'a> {
176
172
}
177
173
}
178
174
Action :: Set { var, expr } => {
179
- let expr = clone_filter ( expr, & |e| {
180
- if let Expression :: Identifier ( id) = e. as_ref ( ) {
181
- if let Some ( expr) = vars. get ( id) {
182
- return Some ( expr. clone ( ) ) ;
183
- }
184
- }
185
- None
186
- } )
187
- . unwrap_or ( expr. clone ( ) ) ;
175
+ let expr = replace_vars ( expr, & vars) ;
188
176
189
- vars. insert ( var. to_owned ( ) , expr) ;
177
+ vars. insert ( var, expr) ;
190
178
}
191
179
_ => ( ) ,
192
180
}
@@ -314,3 +302,15 @@ impl<'a> Builder<'a> {
314
302
node
315
303
}
316
304
}
305
+
306
+ fn replace_vars ( expr : & Rc < Expression > , vars : & HashMap < & str , Rc < Expression > > ) -> Rc < Expression > {
307
+ clone_filter ( expr, & |e| {
308
+ if let Expression :: Identifier ( id) = e. as_ref ( ) {
309
+ if let Some ( expr) = vars. get ( & id. as_str ( ) ) {
310
+ return Some ( expr. clone ( ) ) ;
311
+ }
312
+ }
313
+ None
314
+ } )
315
+ . unwrap_or ( expr. clone ( ) )
316
+ }
0 commit comments