SuperIterable = (iterable) => {
if (Array.isArray(iterable)) return iterable;
if (typeof iterable == "string") iterable = new String(iterable);
const iterator = iterable[Symbol.iterator]();
return new Proxy(iterable, {
get(target, prop, receiver) {
if (prop == "filter") {
return (test) => Generators.filter(iterator, test);
} else if (prop === "find") {
return (test) => {
for (const v of iterable) if (test(v)) return v;
};
} else if (prop == "map") {
return (mapper) => Generators.map(iterator, mapper);
} else if (prop == "reduce") {
return (reducer, init) => {
let result = init;
let i = 0;
for (const v of iterable) result = reducer(result, v, i++);
return result;
};
} else {
const property = target[prop];
return property?.bind ? property.bind(iterable) : property;
}
}
});
}