function* partition(list) {
if (list.length === 1) {
yield [list]
} else {
let first = list[0]
for (let x of partition(list.slice(1))) {
for (let i = 0; i < x.length; i++) {
yield [...(x.slice(0, i)), [first, ...x[i]], ...(x.slice(i+1))]
}
yield [[first], ...x]
}
}
}