| 373 | } |
| 374 | |
| 375 | pub fn extract<F, R>(&self, mut f: F, vm: &VirtualMachine) -> PyResult<Vec<R>> |
| 376 | where |
| 377 | F: FnMut(&PyObject) -> PyResult<R>, |
| 378 | { |
| 379 | if let Some(tuple) = self.obj.downcast_ref_if_exact::<PyTuple>(vm) { |
| 380 | tuple.iter().map(|x| f(x.as_ref())).collect() |
| 381 | } else if let Some(list) = self.obj.downcast_ref_if_exact::<PyList>(vm) { |
| 382 | list.borrow_vec().iter().map(|x| f(x.as_ref())).collect() |
| 383 | } else { |
| 384 | let iter = self.obj.to_owned().get_iter(vm)?; |
| 385 | let iter = iter.iter::<PyObjectRef>(vm)?; |
| 386 | let len = self.length(vm).unwrap_or(0); |
| 387 | let mut v = Vec::with_capacity(len); |
| 388 | for x in iter { |
| 389 | v.push(f(x?.as_ref())?); |
| 390 | } |
| 391 | v.shrink_to_fit(); |
| 392 | Ok(v) |
| 393 | } |
| 394 | } |
| 395 | |
| 396 | pub fn contains(self, target: &PyObject, vm: &VirtualMachine) -> PyResult<bool> { |
| 397 | if let Some(f) = self.slots().contains.load() { |