Skip to content

Commit f72f347

Browse files
committed
Make iterate create the iterator itself
1 parent 2cb6be9 commit f72f347

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

py/internal.go

+27-5
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,9 @@ func Next(self Object) Object {
298298
panic(ExceptionNewf(TypeError, "'%s' object is not iterable", self.Type().Name))
299299
}
300300

301-
// Iterate the iterator until finished calling the function passed in on each object
302-
func Iterate(iterator Object, fn func(Object)) {
301+
// Create an iterator from obj and iterate the iterator until finished
302+
// calling the function passed in on each object
303+
func Iterate(obj Object, fn func(Object)) {
303304
defer func() {
304305
if r := recover(); r != nil {
305306
if IsException(StopIteration, r) {
@@ -309,9 +310,30 @@ func Iterate(iterator Object, fn func(Object)) {
309310
}
310311
}
311312
}()
312-
for {
313-
item := Next(iterator)
314-
fn(item)
313+
// Some easy cases
314+
switch x := obj.(type) {
315+
case Tuple:
316+
for _, item := range x {
317+
fn(item)
318+
}
319+
case *List:
320+
for _, item := range x.Items {
321+
fn(item)
322+
}
323+
case String:
324+
for _, item := range x {
325+
fn(String(item))
326+
}
327+
case Bytes:
328+
for _, item := range x {
329+
fn(Int(item))
330+
}
331+
default:
332+
iterator := Iter(obj)
333+
for {
334+
item := Next(iterator)
335+
fn(item)
336+
}
315337
}
316338
}
317339

py/sequence.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ func SequenceTuple(v Object) Tuple {
1111
return Tuple(x.Items).Copy()
1212
default:
1313
t := Tuple{}
14-
Iterate(Iter(v), func(item Object) {
14+
Iterate(v, func(item Object) {
1515
t = append(t, item)
1616
})
1717
return t
@@ -27,7 +27,7 @@ func SequenceList(v Object) *List {
2727
return x.Copy()
2828
default:
2929
l := NewList()
30-
Iterate(Iter(v), func(item Object) {
30+
Iterate(v, func(item Object) {
3131
l.Append(item)
3232
})
3333
return l

0 commit comments

Comments
 (0)