···269269270270 return result.reverse();
271271};
272272+273273+/**
274274+ * randomly selects an index based on weights
275275+ * @param weights array of weights (numbers)
276276+ * @returns random index selected based on weight distribution or -1 if array is empty
277277+ */
278278+/*#__NO_SIDE_EFFECTS__*/
279279+export const weightedIndex = (weights: number[]): number => {
280280+ const len = weights.length;
281281+282282+ const arr = new Array(len);
283283+ let total = 0;
284284+285285+ for (let i = 0; i < len; i++) {
286286+ const weight = Math.max(0, weights[i]);
287287+ arr[i] = weight;
288288+ total += weight;
289289+ }
290290+291291+ if (total <= 0) {
292292+ return -1;
293293+ }
294294+295295+ let rand = Math.random() * total;
296296+ for (let i = 0; i < len; i++) {
297297+ rand -= arr[i];
298298+299299+ if (rand < 0) {
300300+ return i;
301301+ }
302302+ }
303303+304304+ return len - 1;
305305+};