@@ -111,10 +111,10 @@ impl<T: FieldElement> EffectsInterpreter<T> {
111
111
let mut actions = vec ! [ ] ;
112
112
let mut var_mapper = VariableMapper :: new ( ) ;
113
113
114
- Self :: load_fixed_column_values ( & mut var_mapper, & mut actions , effects) ;
115
- Self :: load_known_inputs ( & mut var_mapper, & mut actions , known_inputs) ;
116
- Self :: process_effects ( & mut var_mapper, & mut actions , effects) ;
117
- Self :: write_data ( & mut var_mapper, & mut actions , effects) ;
114
+ actions . extend ( Self :: load_fixed_column_values ( & mut var_mapper, effects) ) ;
115
+ actions . extend ( Self :: load_known_inputs ( & mut var_mapper, known_inputs) ) ;
116
+ actions . extend ( Self :: process_effects ( & mut var_mapper, effects) ) ;
117
+ actions . extend ( Self :: write_data ( & mut var_mapper, effects) ) ;
118
118
119
119
let ret = Self {
120
120
var_count : var_mapper. var_count ( ) ,
@@ -124,33 +124,31 @@ impl<T: FieldElement> EffectsInterpreter<T> {
124
124
Some ( ret)
125
125
}
126
126
127
- fn load_fixed_column_values (
128
- var_mapper : & mut VariableMapper ,
129
- actions : & mut Vec < InterpreterAction < T > > ,
130
- effects : & [ Effect < T , Variable > ] ,
131
- ) {
132
- actions. extend (
133
- effects
134
- . iter ( )
135
- . flat_map ( |e| e. referenced_variables ( ) )
136
- . filter_map ( |v| match v {
137
- Variable :: FixedCell ( c) => Some ( ( v, c) ) ,
138
- _ => None ,
139
- } )
140
- . unique ( )
141
- . map ( |( var, cell) | {
142
- let idx = var_mapper. map_var ( var) ;
143
- InterpreterAction :: ReadFixedColumn ( idx, cell. clone ( ) )
144
- } ) ,
145
- )
127
+ /// Returns an iterator of actions to load all accessed fixed column values into variables.
128
+ fn load_fixed_column_values < ' a > (
129
+ var_mapper : & ' a mut VariableMapper ,
130
+ effects : & ' a [ Effect < T , Variable > ] ,
131
+ ) -> impl Iterator < Item = InterpreterAction < T > > + ' a {
132
+ effects
133
+ . iter ( )
134
+ . flat_map ( |e| e. referenced_variables ( ) )
135
+ . filter_map ( |v| match v {
136
+ Variable :: FixedCell ( c) => Some ( ( v, c) ) ,
137
+ _ => None ,
138
+ } )
139
+ . unique ( )
140
+ . map ( |( var, cell) | {
141
+ let idx = var_mapper. map_var ( var) ;
142
+ InterpreterAction :: ReadFixedColumn ( idx, cell. clone ( ) )
143
+ } )
146
144
}
147
145
148
- fn load_known_inputs (
149
- var_mapper : & mut VariableMapper ,
150
- actions : & mut Vec < InterpreterAction < T > > ,
151
- known_inputs : & [ Variable ] ,
152
- ) {
153
- actions . extend ( known_inputs. iter ( ) . map ( |var| match var {
146
+ /// Returns an iterator of actions to load all known inputs into variables.
147
+ fn load_known_inputs < ' a > (
148
+ var_mapper : & ' a mut VariableMapper ,
149
+ known_inputs : & ' a [ Variable ] ,
150
+ ) -> impl Iterator < Item = InterpreterAction < T > > + ' a {
151
+ known_inputs. iter ( ) . map ( |var| match var {
154
152
Variable :: WitnessCell ( c) => {
155
153
let idx = var_mapper. map_var ( var) ;
156
154
InterpreterAction :: ReadCell ( idx, c. clone ( ) )
@@ -162,16 +160,16 @@ impl<T: FieldElement> EffectsInterpreter<T> {
162
160
Variable :: FixedCell ( _)
163
161
| Variable :: MachineCallParam ( _)
164
162
| Variable :: IntermediateCell ( _) => unreachable ! ( ) ,
165
- } ) ) ;
163
+ } )
166
164
}
167
165
168
- fn process_effects (
169
- var_mapper : & mut VariableMapper ,
170
- actions : & mut Vec < InterpreterAction < T > > ,
171
- effects : & [ Effect < T , Variable > ] ,
172
- ) {
173
- effects. iter ( ) . for_each ( |effect| {
174
- let action = match effect {
166
+ /// Returns an iterator of actions equivalent to the effects.
167
+ fn process_effects < ' a > (
168
+ var_mapper : & ' a mut VariableMapper ,
169
+ effects : & ' a [ Effect < T , Variable > ] ,
170
+ ) -> impl Iterator < Item = InterpreterAction < T > > + ' a {
171
+ effects. iter ( ) . map ( |effect| {
172
+ match effect {
175
173
Effect :: Assignment ( var, e) => {
176
174
let idx = var_mapper. map_var ( var) ;
177
175
InterpreterAction :: AssignExpression ( idx, var_mapper. map_expr_to_rpn ( e) )
@@ -207,45 +205,44 @@ impl<T: FieldElement> EffectsInterpreter<T> {
207
205
unimplemented ! ( "Prover function calls are not supported in the interpreter yet" )
208
206
}
209
207
Effect :: Branch ( condition, if_branch, else_branch) => {
210
- let mut if_actions = vec ! [ ] ;
211
- Self :: process_effects ( var_mapper, & mut if_actions, if_branch) ;
212
- let mut else_actions = vec ! [ ] ;
213
- Self :: process_effects ( var_mapper, & mut else_actions, else_branch) ;
208
+ let if_actions = Self :: process_effects ( var_mapper, if_branch) . collect ( ) ;
209
+ let else_actions = Self :: process_effects ( var_mapper, else_branch) . collect ( ) ;
214
210
let test = BranchTest :: new ( var_mapper, condition) ;
215
211
InterpreterAction :: Branch ( test, if_actions, else_actions)
216
212
}
217
- } ;
218
- actions. push ( action) ;
213
+ }
219
214
} )
220
215
}
221
216
222
- fn write_data (
223
- var_mapper : & mut VariableMapper ,
224
- actions : & mut Vec < InterpreterAction < T > > ,
225
- effects : & [ Effect < T , Variable > ] ,
226
- ) {
217
+ /// Returns an iterator of actions to write all written variables to the data.
218
+ fn write_data < ' a > (
219
+ var_mapper : & ' a mut VariableMapper ,
220
+ effects : & ' a [ Effect < T , Variable > ] ,
221
+ ) -> impl Iterator < Item = InterpreterAction < T > > + ' a {
227
222
effects
228
223
. iter ( )
229
224
. flat_map ( Effect :: written_vars)
230
- . for_each ( |( var, _mutable) | {
225
+ . filter_map ( |( var, _mutable) | {
231
226
match var {
232
227
Variable :: WitnessCell ( cell) => {
233
228
let idx = var_mapper. get_var ( var) . unwrap ( ) ;
234
- actions . push ( InterpreterAction :: WriteCell ( idx, cell. clone ( ) ) ) ;
229
+ Some ( InterpreterAction :: WriteCell ( idx, cell. clone ( ) ) )
235
230
}
236
231
Variable :: Param ( i) => {
237
232
let idx = var_mapper. get_var ( var) . unwrap ( ) ;
238
- actions . push ( InterpreterAction :: WriteParam ( idx, * i) ) ;
233
+ Some ( InterpreterAction :: WriteParam ( idx, * i) )
239
234
}
240
235
Variable :: FixedCell ( _) => panic ! ( "Should not write to fixed column." ) ,
241
236
Variable :: IntermediateCell ( _) => {
242
237
// Intermediate cells are not stored permanently
238
+ None
243
239
}
244
240
Variable :: MachineCallParam ( _) => {
245
241
// This is just an internal variable.
242
+ None
246
243
}
247
244
}
248
- } ) ;
245
+ } )
249
246
}
250
247
251
248
/// Execute the machine effects for the given the parameters
0 commit comments