@@ -8,8 +8,8 @@ package py
88
99// A python Iterator object
1010type Iterator struct {
11- Pos int
12- Objs [] Object
11+ Pos int
12+ Seq Object
1313}
1414
1515var IteratorType = NewType ("iterator" , "iterator type" )
@@ -20,10 +20,10 @@ func (o *Iterator) Type() *Type {
2020}
2121
2222// Define a new iterator
23- func NewIterator (Objs [] Object ) * Iterator {
23+ func NewIterator (Seq Object ) * Iterator {
2424 m := & Iterator {
25- Pos : 0 ,
26- Objs : Objs ,
25+ Pos : 0 ,
26+ Seq : Seq ,
2727 }
2828 return m
2929}
@@ -33,13 +33,29 @@ func (it *Iterator) M__iter__() (Object, error) {
3333}
3434
3535// 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
3956 }
40- r := it .Objs [it .Pos ]
4157 it .Pos ++
42- return r , nil
58+ return res , nil
4359}
4460
4561// Check interface is satisfied
0 commit comments