export function* range(
start: number,
end: number = undefined,
step: number = 1
): IterableIterator<number> {
if (end === undefined) { end = start; start = 0; }
if (start > end) { for (let i = start; i > end; i -= step) yield i; }
else for (let i = start; i < end; i += step) yield i;
}