aboutsummaryrefslogtreecommitdiff
path: root/lib/unitsToRanges.js
diff options
context:
space:
mode:
authorAndrew Harvey <andrew@alantgeo.com.au>2021-05-14 16:39:38 +1000
committerAndrew Harvey <andrew@alantgeo.com.au>2021-05-14 16:39:38 +1000
commitbc4c8abf95e865755f25e8d3057cfa4898b1b5c3 (patch)
treed16d040913ea64cbe5b6e11202a62c9f1aafc785 /lib/unitsToRanges.js
parentf636c81824436a31c47ce164a59e1aeacfd6551d (diff)
fix units to ranges to deal with complex cases
Diffstat (limited to 'lib/unitsToRanges.js')
-rw-r--r--lib/unitsToRanges.js19
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/unitsToRanges.js b/lib/unitsToRanges.js
index e73388a..764d8f2 100644
--- a/lib/unitsToRanges.js
+++ b/lib/unitsToRanges.js
@@ -65,7 +65,7 @@ module.exports = (units, sourceAddresses) => {
}
})
.flat()
- .sort((a, b) => a - b)
+ .sort(sortNumbers)
.reduce((acc, cur, idx, src) => {
const curParts = cur.match(regexp)
const prevParts = idx > 0 ? src[idx - 1].match(regexp) : null
@@ -98,3 +98,20 @@ module.exports = (units, sourceAddresses) => {
return unitRanges.length ? unitRanges.join(';') : null
}
+
+/* custom sort function where 2 goes before 1A and 1A goes before 1B */
+function sortNumbers(a, b) {
+ if (Number.isInteger(Number(a)) && Number.isInteger(Number(b))) {
+ // both are integers
+ return a - b
+ } else if (Number.isInteger(Number(a)) && !Number.isInteger(Number(b))) {
+ // a is integer but b isn't, so a goes before b
+ return -1
+ } else if (!Number.isInteger(Number(a)) && Number.isInteger(Number(b))) {
+ // a isn't integer but b is, so a goes after b
+ return 1
+ } else {
+ // neither are integers
+ return a.localeCompare(b)
+ }
+}