Skip to content

Commit bb0b4cd

Browse files
committed
Move iteration stuff into sequence.go
1 parent 6bd194a commit bb0b4cd

File tree

2 files changed

+61
-61
lines changed

2 files changed

+61
-61
lines changed

py/internal.go

-61
Original file line numberDiff line numberDiff line change
@@ -286,64 +286,3 @@ func DeleteAttr(self Object, keyObj Object) {
286286
}
287287
panic(ExceptionNewf(TypeError, "attribute name must be string, not '%s'", self.Type().Name))
288288
}
289-
290-
// Call __next__ for the python object
291-
func Next(self Object) Object {
292-
if I, ok := self.(I__next__); ok {
293-
return I.M__next__()
294-
} else if res, ok := TypeCall0(self, "__next__"); ok {
295-
return res
296-
}
297-
298-
panic(ExceptionNewf(TypeError, "'%s' object is not iterable", self.Type().Name))
299-
}
300-
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)) {
304-
defer func() {
305-
if r := recover(); r != nil {
306-
if IsException(StopIteration, r) {
307-
// StopIteration or subclass raised
308-
} else {
309-
panic(r)
310-
}
311-
}
312-
}()
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-
}
337-
}
338-
}
339-
340-
// Call send for the python object
341-
func Send(self, value Object) Object {
342-
if I, ok := self.(I_send); ok {
343-
return I.Send(value)
344-
} else if res, ok := TypeCall1(self, "send", value); ok {
345-
return res
346-
}
347-
348-
panic(ExceptionNewf(TypeError, "'%s' object doesn't have send method", self.Type().Name))
349-
}

py/sequence.go

+61
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,64 @@ func SequenceList(v Object) *List {
3333
return l
3434
}
3535
}
36+
37+
// Call __next__ for the python object
38+
func Next(self Object) Object {
39+
if I, ok := self.(I__next__); ok {
40+
return I.M__next__()
41+
} else if res, ok := TypeCall0(self, "__next__"); ok {
42+
return res
43+
}
44+
45+
panic(ExceptionNewf(TypeError, "'%s' object is not iterable", self.Type().Name))
46+
}
47+
48+
// Create an iterator from obj and iterate the iterator until finished
49+
// calling the function passed in on each object
50+
func Iterate(obj Object, fn func(Object)) {
51+
defer func() {
52+
if r := recover(); r != nil {
53+
if IsException(StopIteration, r) {
54+
// StopIteration or subclass raised
55+
} else {
56+
panic(r)
57+
}
58+
}
59+
}()
60+
// Some easy cases
61+
switch x := obj.(type) {
62+
case Tuple:
63+
for _, item := range x {
64+
fn(item)
65+
}
66+
case *List:
67+
for _, item := range x.Items {
68+
fn(item)
69+
}
70+
case String:
71+
for _, item := range x {
72+
fn(String(item))
73+
}
74+
case Bytes:
75+
for _, item := range x {
76+
fn(Int(item))
77+
}
78+
default:
79+
iterator := Iter(obj)
80+
for {
81+
item := Next(iterator)
82+
fn(item)
83+
}
84+
}
85+
}
86+
87+
// Call send for the python object
88+
func Send(self, value Object) Object {
89+
if I, ok := self.(I_send); ok {
90+
return I.Send(value)
91+
} else if res, ok := TypeCall1(self, "send", value); ok {
92+
return res
93+
}
94+
95+
panic(ExceptionNewf(TypeError, "'%s' object doesn't have send method", self.Type().Name))
96+
}

0 commit comments

Comments
 (0)