import type { IsomorphicIterator } from "@lou.codes/types";
/**
 * Takes a generator function and returns an iterable iterator or asynchronous
 * iterable iterator object.
 *
 * @category Asynchronous Common
 * @example
 * ```typescript
 * const identityGenerator = function* (value) { yield value; };
 * const iterableIterator = createIterableIterator(identityGenerator);
 *
 * const fooIdentity = iterableIterator("foo");
 *
 * for (const value of fooIdentity) {
 * 	console.log(value); // "foo"
 * }
 *
 * // Same IterableIterator as above, return values again:
 *
 * for (const value of fooIdentity) {
 * 	console.log(value); // "foo"
 * }
 * ```
 * @param generatorFunction Generator to be used every time `[Symbol.iterator]` is called.
 * @returns Iterable iterator object.
 */
export declare const createIterableIterator: <
	GeneratorFunction extends () => IsomorphicIterator,
>(
	generatorFunction: GeneratorFunction,
) => GeneratorFunction extends () => IsomorphicIterator<infer Item> ?
	Readonly<
		GeneratorFunction extends (
			(..._arguments: infer _Arguments) => AsyncIterator<Item>
		) ?
			AsyncIterableIterator<Item>
		:	IterableIterator<Item>
	>
:	never;
