async function throttle(iterable, callback, {limit = 4, signal} = {}) {
let i = 0;
const iter = iterable[Symbol.iterator]();
const next = async(channel, {value, done} = iter.next()) => {
if(signal?.aborted) throw new Error(signal.reason);
if(!done) await Promise.resolve(callback(value, i++, channel)).then(() => next(channel));
};
await Promise.all(Array.from({length: limit}, (_, channel) => next(channel)));
}