export function makeFetcher<T>(source?: IterableSource<T>) {
if (!source) return () => undefined;
return createRoot((dispose) => {
const owner = getOwner();
const [subscribe, trigger] = createSignal<void>(undefined, { equals: false });
return async function(): Promise<T | undefined> {
subscribe();
while (source && !isIterator(source)) {
if (isFunction(source)) { source = source(); }
if (isPromise(source)) { source = await source; }
if (isGenerator(source)) { source = source[Symbol.iterator](); }
if (isAsyncGenerator(source)) { source = source[Symbol.asyncIterator](); }
}
if (!source) { console.warn('no source'); return undefined; }
const next = source.next();
const handler = ({ value, done }: IteratorResult<T>): T => {
if (!done) runWithOwner(owner, trigger); else dispose();
return value;
}
return isPromise(next) ? next.then(handler) : handler(next);
}
});
}
export function makeFetcher<T>(source?: IterableSource<T>) {
if (!source) return () => undefined;
return createRoot((dispose) => {
const owner = getOwner();
const [subscribe, trigger] = createSignal<void>(undefined, { equals: false });
return async function(): Promise<T | undefined> {
subscribe();
while (source && !isIterator(source)) {
if (isFunction(source)) { source = source(); }
if (isPromise(source)) { source = await source; }
if (isGenerator(source)) { source = source[Symbol.iterator](); }
if (isAsyncGenerator(source)) { source = source[Symbol.asyncIterator](); }
}
if (!source) { console.warn('no source'); return undefined; }
const next = source.next();
const handler = ({ value, done }: IteratorResult<T>): T => {
if (!done) runWithOwner(owner, trigger); else dispose();
return value;
}
return isPromise(next) ? next.then(handler) : handler(next);
}
});
}