Range expansion: Difference between revisions
→JavaScript ES6: Tidied, updated primitives.
(Added solution for Action!) |
(→JavaScript ES6: Tidied, updated primitives.) |
||
Line 2,134:
====ES6====
"use strict";
// ----------------- RANGE EXPANSION -----------------
▲<lang JavaScript>(strTest => {
// expansion :: String -> [Int]
// A list of integers parsed from a
// comma-delimited string which may include
// (rising) hyphenated ranges.
) : `-${s}`,
)▼
) : [Number(s)]
[]
)
▲ )
.flatMap(
ns => 2 === ns.length ? (
uncurry(enumFromTo)(ns)
) : ns
);
▲ [].concat.apply([], strExpr.split(',')
▲ .map(x => x.split('-')
▲ .reduce((a, s, i, l) =>
// ---------------------- TEST -----------------------
// main :: IO ()
const main = () =>
▲ s.length ? i ? a.concat(
▲ parseInt(l[i - 1].length ? s :
▲ '-' + s, 10)
▲ ) : [+s] : a, [])
▲ )
// --------------------- GENERIC ---------------------
const enumFromTo = m =>
n => Array.from({
length: 1 + n - m
}, (_, i) => m + i);
▲ // range :: Int -> Int -> Maybe Int -> [Int]
▲ range = (m, n, step) => {
▲ let d = (step || 1) * (n >= m ? 1 : -1);
// uncurry :: (a -> b -> c)
const uncurry = f =>
▲ length: Math.floor((n - m) / d) + 1
// A function over
// from a curried function.
(...args) => {
const [x, y] = Boolean(args.length % 2) ? (
args[0]
) : args;
return f(x)(y);
};
// MAIN ---
return
})();</lang>
▲})('-6,-3--1,3-5,7-11,14,15,17-20');</lang>
{{Out}}
<
=={{header|jq}}==
|