let vecs2d, delimVec, extraDelimVec;
delimVec = createVector();
extraDelimVec = new p5.Vector(Math.E, TAU, PI);
vecs.push(createVector());
vecs.push(createVector(100, 100));
vecs.push(new p5.Vector(150, 100));
vecs.push(createVector(150, 150));
vecs.push(extraDelimVec);
vecs.push(createVector(300, 100));
vecs.push(extraDelimVec);
vecs.push(createVector(350, 100));
vecs.push(createVector(350, 150));
vecs.push(extraDelimVec);
const delimIndexes = indicesOf(vecs,
p5.Vector.prototype.equals,
delimVec, extraDelimVec);
vecs2d = splitListAsList2d(vecs, delimIndexes);
for (const vecs1d of vecs2d) print(vecs1d);
for (const vecs1d of vecs2d) console.table(vecs1d);
function indicesOf(list, equals, ...delims) {
if (!(list && _len(list) && _isIterable(list))) {
console.warn("Parameter 'list' is empty or non-iterable container!");
if (delims.length == 1 && _isIterable(delims[0])) delims = delims[0];
gotDelims = !!_len(delims),
useEquals = typeof equals == 'function';
for (const elem of list.values()) {
if (!elem) indices.push(i);
else if (gotDelims) for (const delim of delims.values())
if (useEquals? equals.call(elem, delim) : elem == delim) {
return new Uint32Array(indices);
function splitListAsList2d(list, ...indices) {
const list2d = [], size = _len(list), lastIdx = size - 1;
if (!(list && size && _isIterable(list))) {
console.warn("Parameter 'list' is empty or non-iterable container!");
const indexes = _validateIndices(lastIdx, ...indices);
if (!indexes.length) return list2d;
if (_isHashable(list)) list = [...list.values()];
for (let list1d, sequenceGotInterrupted = true, i = 0; i < size; ++i) {
if (indexes.includes(i)) {
sequenceGotInterrupted = true;
if (sequenceGotInterrupted) {
list2d.push(list1d = []);
sequenceGotInterrupted = false;
function _validateIndices(maxIndex, ...indices) {
if (indices.length == 1 && _isIterable(indices[0])) indices = indices[0];
console.warn("Parameter 'indices' is an empty container!");
const maxIdx = min(abs(maxIndex), 2**32 - 1), indexes = new Set;
for (const idx of indices.values())
idx >= 0 && idx <= maxIdx && indexes.add(parseInt(idx));
return new Uint32Array(indexes).sort();
return abs(parseInt(obj && ('size' in obj? obj.size : obj.length))) || 0;
function _isIterable(obj) {
return obj && typeof obj.values == 'function';
function _isHashable(obj) {
return obj && typeof obj.has == 'function';