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

Lines changed: 0 additions & 61 deletions
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

Lines changed: 61 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy