@@ -11,8 +11,9 @@ func SequenceTuple(v Object) Tuple {
11
11
return Tuple (x .Items ).Copy ()
12
12
default :
13
13
t := Tuple {}
14
- Iterate (v , func (item Object ) {
14
+ Iterate (v , func (item Object ) bool {
15
15
t = append (t , item )
16
+ return false
16
17
})
17
18
return t
18
19
}
@@ -27,9 +28,7 @@ func SequenceList(v Object) *List {
27
28
return x .Copy ()
28
29
default :
29
30
l := NewList ()
30
- Iterate (v , func (item Object ) {
31
- l .Append (item )
32
- })
31
+ l .ExtendSequence (v )
33
32
return l
34
33
}
35
34
}
@@ -61,25 +60,34 @@ func Next(self Object) (obj Object, finished Object) {
61
60
}
62
61
63
62
// Create an iterator from obj and iterate the iterator until finished
64
- // calling the function passed in on each object
65
- func Iterate (obj Object , fn func (Object )) {
63
+ // calling the function passed in on each object. The iteration is
64
+ // finished if the function returns true
65
+ func Iterate (obj Object , fn func (Object ) bool ) {
66
66
// Some easy cases
67
67
switch x := obj .(type ) {
68
68
case Tuple :
69
69
for _ , item := range x {
70
- fn (item )
70
+ if fn (item ) {
71
+ break
72
+ }
71
73
}
72
74
case * List :
73
75
for _ , item := range x .Items {
74
- fn (item )
76
+ if fn (item ) {
77
+ break
78
+ }
75
79
}
76
80
case String :
77
81
for _ , item := range x {
78
- fn (String (item ))
82
+ if fn (String (item )) {
83
+ break
84
+ }
79
85
}
80
86
case Bytes :
81
87
for _ , item := range x {
82
- fn (Int (item ))
88
+ if fn (Int (item )) {
89
+ break
90
+ }
83
91
}
84
92
default :
85
93
iterator := Iter (obj )
@@ -88,7 +96,9 @@ func Iterate(obj Object, fn func(Object)) {
88
96
if finished != nil {
89
97
break
90
98
}
91
- fn (item )
99
+ if fn (item ) {
100
+ break
101
+ }
92
102
}
93
103
}
94
104
}
@@ -103,3 +113,15 @@ func Send(self, value Object) Object {
103
113
104
114
panic (ExceptionNewf (TypeError , "'%s' object doesn't have send method" , self .Type ().Name ))
105
115
}
116
+
117
+ // SequenceContains returns True if obj is in seq
118
+ func SequenceContains (seq , obj Object ) (found bool ) {
119
+ Iterate (seq , func (item Object ) bool {
120
+ if Eq (item , obj ) == True {
121
+ found = true
122
+ return true
123
+ }
124
+ return false
125
+ })
126
+ return
127
+ }
0 commit comments