creates a lazy Iterable that will produce integers until error
Iterable<int> get infiniteRange sync* { var i = 0; while (true) { yield i; i++; } }