Python/Ruby like generators in Vala
Hello,
the post below is copied straight from here.
Here I’ll show a cool snippet code making use Vala async functions and iterators for emulating Python/Ruby generators. Creating a generator is as simple as extending the Generator class and implementing the generate() method.
abstract class Generator {
private bool consumed;
private G value;
private SourceFunc callback;
public Generator () {
helper ();
}
private async void helper () {
yield generate ();
consumed \= true;
}
protected abstract async void generate ();
protected async void feed (G value) {
this.value \= value;
this.callback \= feed.callback;
yield;
}
public bool next () {
return !consumed;
}
public G get () {
var result \= value;
callback ();
return result;
}
public Generator<G> iterator () {
return this;
}
}
class IntGenerator : Generator<int> {
protected override async void generate () {
for (int i\=0; i < 10; i++) {
yield feed (i);
}
}
}
void main () {
var gen \= new IntGenerator ();
foreach (var i in gen) {
message ("%d", i);
}
}
You can find the above code snippet here as well.