@@ -8,8 +8,8 @@ package py
8
8
9
9
// A python Iterator object
10
10
type Iterator struct {
11
- Pos int
12
- Objs [] Object
11
+ Pos int
12
+ Seq Object
13
13
}
14
14
15
15
var IteratorType = NewType ("iterator" , "iterator type" )
@@ -20,10 +20,10 @@ func (o *Iterator) Type() *Type {
20
20
}
21
21
22
22
// Define a new iterator
23
- func NewIterator (Objs [] Object ) * Iterator {
23
+ func NewIterator (Seq Object ) * Iterator {
24
24
m := & Iterator {
25
- Pos : 0 ,
26
- Objs : Objs ,
25
+ Pos : 0 ,
26
+ Seq : Seq ,
27
27
}
28
28
return m
29
29
}
@@ -33,13 +33,29 @@ func (it *Iterator) M__iter__() (Object, error) {
33
33
}
34
34
35
35
// Get next one from the iteration
36
- func (it * Iterator ) M__next__ () (Object , error ) {
37
- if it .Pos >= len (it .Objs ) {
38
- return nil , StopIteration
36
+ func (it * Iterator ) M__next__ () (res Object , err error ) {
37
+ if tuple , ok := it .Seq .(Tuple ); ok {
38
+ if it .Pos >= len (tuple ) {
39
+ return nil , StopIteration
40
+ }
41
+ res = tuple [it .Pos ]
42
+ it .Pos ++
43
+ return res , nil
44
+ }
45
+ index := Int (it .Pos )
46
+ if I , ok := it .Seq .(I__getitem__ ); ok {
47
+ res , err = I .M__getitem__ (index )
48
+ } else if res , ok , err = TypeCall1 (it .Seq , "__getitem__" , index ); ! ok {
49
+ return nil , ExceptionNewf (TypeError , "'%s' object is not iterable" , it .Type ().Name )
50
+ }
51
+ if err != nil {
52
+ if IsException (IndexError , err ) {
53
+ return nil , StopIteration
54
+ }
55
+ return nil , err
39
56
}
40
- r := it .Objs [it .Pos ]
41
57
it .Pos ++
42
- return r , nil
58
+ return res , nil
43
59
}
44
60
45
61
// Check interface is satisfied
0 commit comments