locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
26 lines (25 loc) • 928 B
JavaScript
export function subsequences(items) {
// discuss at: https://locutus.io/haskell/list/subsequences/
// original by: Kevin van Zonneveld (https://kvz.io)
// note 1: Returns all subsequences (power set) while preserving element order, matching Haskell Data.List.subsequences.
// example 1: subsequences([1, 2, 3])
// returns 1: [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
// example 2: subsequences(['a', 'b'])
// returns 2: [[], ['a'], ['b'], ['a', 'b']]
// example 3: subsequences([])
// returns 3: [[]]
if (!Array.isArray(items)) {
return [[]];
}
const out = [[]];
for (const item of items) {
const currentLength = out.length;
for (let i = 0; i < currentLength; i++) {
const prefix = out[i];
if (prefix) {
out.push([...prefix, item]);
}
}
}
return out;
}