ds={ "init":func(end){@end=end; @current=0 but true}, "current":func(){current}, "next":func(){ ((next=current+1) <= end) ? [true] {@current=next but current} :: {nil} } , "filter":func(item,index) { item > 0 } , "map": func(item,index) { item * 2 } } /* Example ; it=$(ds,3); add(it) */