@@ -84,19 +84,25 @@ pub fn create_filter(
8484 Ok ( iter_obj)
8585}
8686
87- //pub fn create_map(vm: &mut VirtualMachine,
88- // mapper: &PyObjectRef,
89- // iterators: &PyObjectRef) -> PyResult {
90- // let iter_obj = PyObject::new(
91- // PyObjectPayload::MapIterator {
92- // predicate: predicate.clone(),
93- // iterator: iterator.clone(),
94- // },
95- // vm.ctx.iter_type(),
96- // );
97- //
98- // Ok(iter_obj)
99- //}
87+ pub fn create_map (
88+ vm : & mut VirtualMachine ,
89+ mapper : & PyObjectRef ,
90+ iterables : & [ PyObjectRef ] ,
91+ ) -> PyResult {
92+ let iterators = iterables
93+ . into_iter ( )
94+ . map ( |iterable| get_iter ( vm, iterable) )
95+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
96+ let iter_obj = PyObject :: new (
97+ PyObjectPayload :: MapIterator {
98+ mapper : mapper. clone ( ) ,
99+ iterators,
100+ } ,
101+ vm. ctx . iter_type ( ) ,
102+ ) ;
103+
104+ Ok ( iter_obj)
105+ }
100106
101107// Sequence iterator:
102108fn iter_new ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
@@ -195,6 +201,23 @@ fn iter_next(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
195201 }
196202 }
197203 }
204+ PyObjectPayload :: MapIterator {
205+ ref mut mapper,
206+ ref mut iterators,
207+ } => {
208+ let next_objs = iterators
209+ . iter ( )
210+ . map ( |iterator| call_next ( vm, iterator) )
211+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
212+
213+ vm. invoke (
214+ mapper. clone ( ) ,
215+ PyFuncArgs {
216+ args : next_objs,
217+ kwargs : vec ! [ ] ,
218+ } ,
219+ )
220+ }
198221 _ => {
199222 panic ! ( "NOT IMPL" ) ;
200223 }
0 commit comments