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.
No comments:
Post a Comment