That is how the
built-in enumerator works, you can define your own
enumerator (also see
for-loop and
_newEnum()), taking any amount of steps per iteration, or do whatever you want. Simple example of a variable step-sized enumerator,
Code: Select all
class myStepEnum extends enumbase{
__new(arr,stepSize:=3,startAt:=1){
this.arr:=arr
this.ss:=stepSize
this.i:=startAt
}
next(byref key, byref value:=""){
return objhaskey(this.arr,this.i) ? (value:=this.arr[this.i], key:=this.i, this.i+=this.ss, true) : false
}
}
class enumbase {
next(byref key:="", byref value:=""){
throw exception("Next() not implemented.")
}
_newenum(){
return this
}
}
Example usage,
Code: Select all
myArray:=[0,0,1,0,0,2,0,0,3]
stepSize:=3
startAt:=3
for k, v in new myStepEnum(myArray,stepSize,startAt)
str.= k "`t" v "`n"
msgbox % str:="key:`tval:`n" . str
/*
key: val:
3 1
6 2
9 3
*/
Another example, just to feed your imagination,
Code: Select all
arr:=[0,37,1,0,0,2,37,0,3]
arr["hello"]:=37
for k, v in new enumByVal(arr,37)
str.= k "`t" v "`n"
msgbox % str:="key:`tval:`n" . str
/*
key: val:
2 37
7 37
hello 37
*/
class enumByVal extends enumbase {
; Loop visits only key/value pairs where value = val
__new(arr,val){
this.arr:=arr
this.enum:=arr._NewEnum()
this.val:=val
}
next(byref k:="", byref v:=""){
while this.enum.next(k,v){
if (v=this.val)
return true
}
return false
}
}
Cheers.