{"version":3,"file":"sort-helpers-l5F74f2e.js","sources":["../../../../scripts/services/helpers/sort-helpers.ts"],"sourcesContent":["/** \r\n * Sort Helpers: \r\n * Sorting methods that take a collection of elements and rearrange them in a specified order \r\n */\r\n\r\n\r\n/**\r\n * Checks for existing randomization data, persists new data to localStorage if needed, and returns sequence-shifted array\r\n * @param baseArray\r\n * @param prefix\r\n * @returns A new array in the same sequence but a (probably) shifted start index\r\n */\r\nexport function shiftAndPersist(baseArray: unknown[], prefix: string): unknown[] {\r\n if (!baseArray || baseArray.length === 0) {\r\n return [];\r\n }\r\n\r\n if (baseArray.length === 1) {\r\n // If there's only one item, we don't need to do any of the shifting or persisting\r\n return baseArray;\r\n }\r\n\r\n const localStorageName = `${prefix}Randomization`;\r\n const oneHourInMS = 60 * 60 * 1000;\r\n const currentTS = Date.now();\r\n let shouldRandomize = true;\r\n let startIndex = 0;\r\n let savedIndex = -1;\r\n\r\n const localStorageValue = localStorage.getItem(localStorageName);\r\n\r\n // Check for saved data\r\n if (localStorageValue && /^\\d+\\|\\d+$/.test(localStorageValue)) {\r\n const splitValues = localStorageValue.split(\"|\");\r\n savedIndex = parseInt(splitValues[0], 10);\r\n const savedTS = parseInt(splitValues[1], 10);\r\n\r\n if ((currentTS - savedTS) < oneHourInMS) {\r\n shouldRandomize = false;\r\n startIndex = savedIndex;\r\n }\r\n }\r\n\r\n // Get random index and persist data, if needed\r\n if (shouldRandomize) {\r\n do { // do...while to prevent selecting the same random value as before\r\n startIndex = Math.floor(Math.random() * baseArray.length);\r\n } while (startIndex === savedIndex);\r\n\r\n localStorage.setItem(localStorageName, `${startIndex}|${currentTS}`);\r\n }\r\n\r\n // Shift the array sequence\r\n return shiftArraySequence(baseArray, startIndex);\r\n}\r\n\r\n\r\n/**\r\n * Returns an array in the same sequence but starting with the selected index\r\n * e.g. baseArray = [1, 2, 3, 4], shiftIndex = 2 returns [3, 4, 1, 2]\r\n * @param baseArray\r\n * @param shiftIndex\r\n * @returns A new array in the same sequence but a (probably) shifted start index\r\n */\r\nexport function shiftArraySequence(baseArray: unknown[], shiftIndex: number): unknown[] {\r\n if (baseArray.length === 0) {\r\n return [];\r\n }\r\n\r\n const newIndex = shiftIndex % baseArray.length; // handles overflows\r\n\r\n if (newIndex === 0) {\r\n return baseArray;\r\n }\r\n\r\n return [...baseArray.slice(newIndex), ...baseArray.slice(0, newIndex)];\r\n}\r\n\r\n\r\n/**\r\n * Modifies the original array variable to randomize the items (Fisher-Yates shuffle)\r\n * You shouldn't need to assign the return value, but can chain it if needed (e.g. shuffleInPlace(a).slice(0,-1))\r\n * @param a\r\n */\r\nexport function shuffleInPlace(a: unknown[]): unknown[] {\r\n for (let origIndex = a.length - 1; origIndex > 0; origIndex--) {\r\n const newIndex = Math.floor(Math.random() * (origIndex + 1));\r\n [a[origIndex], a[newIndex]] = [a[newIndex], a[origIndex]]; // Deconstruction swap-in-place\r\n }\r\n return a;\r\n}"],"names":["shiftAndPersist","baseArray","prefix","localStorageName","oneHourInMS","currentTS","shouldRandomize","startIndex","savedIndex","localStorageValue","splitValues","savedTS","shiftArraySequence","shiftIndex","newIndex","shuffleInPlace","a","origIndex"],"mappings":"AAYgB,SAAAA,EAAgBC,EAAsBC,EAA2B,CAC7E,GAAI,CAACD,GAAaA,EAAU,SAAW,EACnC,MAAO,GAGP,GAAAA,EAAU,SAAW,EAEd,OAAAA,EAGL,MAAAE,EAAmB,GAAGD,CAAM,gBAC5BE,EAAc,GAAK,GAAK,IACxBC,EAAY,KAAK,MACvB,IAAIC,EAAkB,GAClBC,EAAa,EACbC,EAAa,GAEX,MAAAC,EAAoB,aAAa,QAAQN,CAAgB,EAG/D,GAAIM,GAAqB,aAAa,KAAKA,CAAiB,EAAG,CACrD,MAAAC,EAAcD,EAAkB,MAAM,GAAG,EAC/CD,EAAa,SAASE,EAAY,CAAC,EAAG,EAAE,EACxC,MAAMC,EAAU,SAASD,EAAY,CAAC,EAAG,EAAE,EAEtCL,EAAYM,EAAWP,IACNE,EAAA,GACLC,EAAAC,EAErB,CAGA,GAAIF,EAAiB,CACd,GACCC,EAAa,KAAK,MAAM,KAAK,SAAWN,EAAU,MAAM,QACnDM,IAAeC,GAExB,aAAa,QAAQL,EAAkB,GAAGI,CAAU,IAAIF,CAAS,EAAE,CACvE,CAGO,OAAAO,EAAmBX,EAAWM,CAAU,CACnD,CAUgB,SAAAK,EAAmBX,EAAsBY,EAA+B,CAChF,GAAAZ,EAAU,SAAW,EACrB,MAAO,GAGL,MAAAa,EAAWD,EAAaZ,EAAU,OAExC,OAAIa,IAAa,EACNb,EAGJ,CAAC,GAAGA,EAAU,MAAMa,CAAQ,EAAG,GAAGb,EAAU,MAAM,EAAGa,CAAQ,CAAC,CACzE,CAQO,SAASC,EAAeC,EAAyB,CACpD,QAASC,EAAYD,EAAE,OAAS,EAAGC,EAAY,EAAGA,IAAa,CAC3D,MAAMH,EAAW,KAAK,MAAM,KAAK,UAAYG,EAAY,EAAE,EAC3D,CAACD,EAAEC,CAAS,EAAGD,EAAEF,CAAQ,CAAC,EAAI,CAACE,EAAEF,CAAQ,EAAGE,EAAEC,CAAS,CAAC,CAC5D,CACO,OAAAD,CACX"}