@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
219 lines (218 loc) • 5.71 kB
JavaScript
;
import { pushOnArrayAtEntry } from "./MapUtils";
import { setUnion, setToArray, setIntersection, setDifference, setXOR } from "./SetUtils";
import { isString } from "./Type";
import { randFloat } from "./math/_Module";
const _tmp = /* @__PURE__ */ new Set();
const _tmp0 = /* @__PURE__ */ new Set();
const _tmp1 = /* @__PURE__ */ new Set();
export function range(start, end, step, target) {
if (end == null) {
end = start;
start = 0;
}
const length = Math.floor((end - start) / step);
target.length = length;
for (let i = 0; i < length; i++) {
target[i] = start + i * step;
}
return target;
}
export function rangeWithEnd(end) {
const target = [];
range(0, end, 1, target);
return target;
}
export function rangeStartEnd(start, end) {
const target = [];
range(start, end, 1, target);
return target;
}
export function arrayUniq(array, target) {
target.length = 0;
for (const element of array) {
if (!target.includes(element)) {
target.push(element);
}
}
return target;
}
export function sampleIndex(array, seed) {
return Math.floor(randFloat(seed) * array.length);
}
export function sample(array, seed) {
return array[sampleIndex(array, seed)];
}
export function spliceSample(array, seed) {
return array.splice(sampleIndex(array, seed), 1)[0];
}
export function uniqWithoutPreservingOrder(array, target) {
arrayToSet(array, _tmp);
return setToArray(_tmp, target);
}
export function arrayCompact(array, target) {
target.length = 0;
for (let i = 0; i < array.length; i++) {
const elem = array[i];
if (elem != null) {
target.push(elem);
}
}
return target;
}
export function arrayMin(array) {
let min = array[0];
for (let i = 0; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
}
}
return min;
}
export function arrayMax(array) {
let max = array[0];
for (let i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
export function arraySum(array) {
let sum = 0;
for (let i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}
export function arrayChunk(array, chunkSize) {
const newArray = [];
let newSubArray = [];
newArray.push(newSubArray);
for (let i = 0; i < array.length; i++) {
if (newSubArray.length == chunkSize) {
newSubArray = [];
newArray.push(newSubArray);
}
newSubArray.push(array[i]);
}
return newArray;
}
export function arrayUnion(array0, array1, target) {
setUnion(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);
setToArray(_tmp, target);
return target;
}
export function arrayIntersection(array0, array1, target) {
setIntersection(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);
setToArray(_tmp, target);
return target;
}
export function arrayDifference(array0, array1, target) {
setDifference(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);
setToArray(_tmp, target);
return target;
}
export function arrayXOR(array0, array1, target) {
setXOR(arrayToSet(array0, _tmp0), arrayToSet(array1, _tmp1), _tmp);
setToArray(_tmp, target);
return target;
}
export function arrayToSet(array, target) {
target.clear();
for (let i = 0; i < array.length; i++) {
target.add(array[i]);
}
return target;
}
export function arrayIsEqual(array0, array1) {
if (array0.length != array1.length) {
return false;
}
const count = array0.length;
for (let i = 0; i < count; i++) {
if (array0[i] != array1[i]) {
return false;
}
}
return true;
}
export function arraySortBy(array, callback) {
if (array.length == 0) {
return [];
}
const elementsByValue = /* @__PURE__ */ new Map();
const valuesSet = /* @__PURE__ */ new Set();
for (const elem of array) {
const value = callback(elem);
valuesSet.add(value);
pushOnArrayAtEntry(elementsByValue, value, elem);
}
const values = new Array(valuesSet.size);
let i = 0;
valuesSet.forEach((value) => {
values[i] = value;
i++;
});
if (isString(values[0])) {
values.sort();
} else {
values.sort((a, b) => a - b);
}
const sorted_elements = new Array(array.length);
i = 0;
for (const value of values) {
const elements_for_value = elementsByValue.get(value);
if (elements_for_value) {
for (const element of elements_for_value) {
sorted_elements[i] = element;
i++;
}
}
}
return sorted_elements;
}
export function arrayShallowClone(array) {
return [...array];
}
export function arrayMap(array, callback, target) {
target.length = 0;
for (const item of array) {
target.push(callback(item));
}
return target;
}
export function arrayAverage(array) {
return arraySum(array) / array.length;
}
export class ArrayUtils {
}
ArrayUtils.shallowClone = arrayShallowClone;
ArrayUtils.min = arrayMin;
ArrayUtils.max = arrayMax;
ArrayUtils.sum = arraySum;
ArrayUtils.compact = arrayCompact;
ArrayUtils.uniq = arrayUniq;
ArrayUtils.uniqWithoutPreservingOrder = uniqWithoutPreservingOrder;
ArrayUtils.chunk = arrayChunk;
ArrayUtils.union = arrayUnion;
ArrayUtils.intersection = arrayIntersection;
ArrayUtils.toSet = arrayToSet;
ArrayUtils.isEqual = arrayIsEqual;
ArrayUtils.sortBy = arraySortBy;
ArrayUtils.range = range;
export function arrayPushItems(srcArray, target) {
for (const item of srcArray) {
target.push(item);
}
}
export function arrayCopy(srcArray, targetArray) {
targetArray.length = srcArray.length;
for (let i = 0; i < srcArray.length; i++) {
targetArray[i] = srcArray[i];
}
}
export function typedArrayCopy(srcArray, targetArray) {
targetArray.set(srcArray);
return targetArray;
}