here I'll show a cool snippet code making use Vala async functions for emulating Python/Ruby generators. Creating a generator is as simple as extending the Generator class and implementing the generate() method.
abstract class Generator<G> {
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.