async function* tails(agen, opts) {
let {
n,
i = 0,
k = 1,
bufs = {},
cap = Infinity,
fun = async v => v
} = opts || {};
for await (let obj of agen) {
for (let key in obj) {
let buf = bufs[key] || (bufs[key] = [])
if (buf.push(...await fun(obj[key])) >= cap)
buf = bufs[key] = buf.slice(-cap)
if (i++ >= n && n != null)
break;
else if (i % k == 0)
yield bufs;
}
}
yield bufs;
}