forked from micropython/micropython
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
61 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,6 +42,7 @@ Q(complex) | |
Q(dict) | ||
Q(divmod) | ||
Q(enumerate) | ||
Q(filter) | ||
Q(float) | ||
Q(hash) | ||
Q(int) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
#include <stdlib.h> | ||
#include <assert.h> | ||
|
||
#include "misc.h" | ||
#include "mpconfig.h" | ||
#include "obj.h" | ||
#include "runtime.h" | ||
|
||
typedef struct _mp_obj_filter_t { | ||
mp_obj_base_t base; | ||
mp_obj_t fun; | ||
mp_obj_t iter; | ||
} mp_obj_filter_t; | ||
|
||
static mp_obj_t filter_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args) { | ||
/* NOTE: args are backwards */ | ||
mp_obj_filter_t *o = m_new_obj(mp_obj_filter_t); | ||
assert(n_args == 2); | ||
o->base.type = &filter_type; | ||
o->fun = args[1]; | ||
o->iter = rt_getiter(args[0]); | ||
return o; | ||
} | ||
|
||
static mp_obj_t filter_getiter(mp_obj_t self_in) { | ||
return self_in; | ||
} | ||
|
||
static mp_obj_t filter_iternext(mp_obj_t self_in) { | ||
assert(MP_OBJ_IS_TYPE(self_in, &filter_type)); | ||
mp_obj_filter_t *self = self_in; | ||
mp_obj_t next; | ||
while ((next = rt_iternext(self->iter)) != mp_const_stop_iteration) { | ||
mp_obj_t val; | ||
if (self->fun != mp_const_none) { | ||
val = rt_call_function_n(self->fun, 1, &next); | ||
} else { | ||
val = next; | ||
} | ||
if (rt_is_true(val)) { | ||
return next; | ||
} | ||
} | ||
return mp_const_stop_iteration; | ||
} | ||
|
||
const mp_obj_type_t filter_type = { | ||
{ &mp_const_type }, | ||
"filter", | ||
.make_new = filter_make_new, | ||
.getiter = filter_getiter, | ||
.iternext = filter_iternext, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
print(list(filter(lambda x: x & 1, range(-3, 4)))) | ||
print(list(filter(None, range(-3, 4)))) |