-
Notifications
You must be signed in to change notification settings - Fork 95
/
Copy pathfilter.go
72 lines (63 loc) · 1.58 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2023 The go-python Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package py
// A python Filter object
type Filter struct {
it Object
fun Object
}
var FilterType = NewTypeX("filter", `filter(function or None, iterable) --> filter object
Return an iterator yielding those items of iterable for which function(item)
is true. If function is None, return the items that are true.`,
FilterTypeNew, nil)
// Type of this object
func (f *Filter) Type() *Type {
return FilterType
}
// FilterTypeNew
func FilterTypeNew(metatype *Type, args Tuple, kwargs StringDict) (res Object, err error) {
var fun, seq Object
var it Object
err = UnpackTuple(args, kwargs, "filter", 2, 2, &fun, &seq)
if err != nil {
return nil, err
}
it, err = Iter(seq)
if err != nil {
return nil, err
}
return &Filter{it: it, fun: fun}, nil
}
func (f *Filter) M__iter__() (Object, error) {
return f, nil
}
func (f *Filter) M__next__() (Object, error) {
var ok bool
for {
item, err := Next(f.it)
if err != nil {
return nil, err
}
// if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type)
if _, _ok := f.fun.(Bool); _ok || f.fun == None {
ok, err = ObjectIsTrue(item)
} else {
var good Object
good, err = Call(f.fun, Tuple{item}, nil)
if err != nil {
return nil, err
}
ok, err = ObjectIsTrue(good)
}
if ok {
return item, nil
}
if err != nil {
return nil, err
}
}
}
// Check interface is satisfied
var _ I__iter__ = (*Filter)(nil)
var _ I__next__ = (*Filter)(nil)