@@ -11,8 +11,9 @@ func SequenceTuple(v Object) Tuple {
1111 return Tuple (x .Items ).Copy ()
1212 default :
1313 t := Tuple {}
14- Iterate (v , func (item Object ) {
14+ Iterate (v , func (item Object ) bool {
1515 t = append (t , item )
16+ return false
1617 })
1718 return t
1819 }
@@ -27,9 +28,7 @@ func SequenceList(v Object) *List {
2728 return x .Copy ()
2829 default :
2930 l := NewList ()
30- Iterate (v , func (item Object ) {
31- l .Append (item )
32- })
31+ l .ExtendSequence (v )
3332 return l
3433 }
3534}
@@ -61,25 +60,34 @@ func Next(self Object) (obj Object, finished Object) {
6160}
6261
6362// 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 ) {
6666 // Some easy cases
6767 switch x := obj .(type ) {
6868 case Tuple :
6969 for _ , item := range x {
70- fn (item )
70+ if fn (item ) {
71+ break
72+ }
7173 }
7274 case * List :
7375 for _ , item := range x .Items {
74- fn (item )
76+ if fn (item ) {
77+ break
78+ }
7579 }
7680 case String :
7781 for _ , item := range x {
78- fn (String (item ))
82+ if fn (String (item )) {
83+ break
84+ }
7985 }
8086 case Bytes :
8187 for _ , item := range x {
82- fn (Int (item ))
88+ if fn (Int (item )) {
89+ break
90+ }
8391 }
8492 default :
8593 iterator := Iter (obj )
@@ -88,7 +96,9 @@ func Iterate(obj Object, fn func(Object)) {
8896 if finished != nil {
8997 break
9098 }
91- fn (item )
99+ if fn (item ) {
100+ break
101+ }
92102 }
93103 }
94104}
@@ -103,3 +113,15 @@ func Send(self, value Object) Object {
103113
104114 panic (ExceptionNewf (TypeError , "'%s' object doesn't have send method" , self .Type ().Name ))
105115}
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