Skip to content

Instantly share code, notes, and snippets.

@hraban
Last active November 16, 2017 18:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hraban/d2ad734f0365f9aac0adb7c616286ac0 to your computer and use it in GitHub Desktop.
Save hraban/d2ad734f0365f9aac0adb7c616286ac0 to your computer and use it in GitHub Desktop.
carthesian product in TypeScript
function carthesian<T>(columns: T[][], f: (x: T[]) => void, stackOut: T[] = []): void {
if (columns.length === 0) {
f(stackOut)
} else {
const column = columns.shift()!;
column.forEach(entry => {
stackOut.push(entry);
carthesian(columns, f, stackOut);
stackOut.pop();
});
columns.unshift(column);
}
}
const columns = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
carthesian(columns, x => console.log(x));
// =>
//
// [ 1, 4, 7 ]
// [ 1, 4, 8 ]
// [ 1, 4, 9 ]
// [ 1, 5, 7 ]
// [ 1, 5, 8 ]
// [ 1, 5, 9 ]
// [ 1, 6, 7 ]
// [ 1, 6, 8 ]
// [ 1, 6, 9 ]
// [ 2, 4, 7 ]
// [ 2, 4, 8 ]
// [ 2, 4, 9 ]
// [ 2, 5, 7 ]
// [ 2, 5, 8 ]
// [ 2, 5, 9 ]
// [ 2, 6, 7 ]
// [ 2, 6, 8 ]
// [ 2, 6, 9 ]
// [ 3, 4, 7 ]
// [ 3, 4, 8 ]
// [ 3, 4, 9 ]
// [ 3, 5, 7 ]
// [ 3, 5, 8 ]
// [ 3, 5, 9 ]
// [ 3, 6, 7 ]
// [ 3, 6, 8 ]
// [ 3, 6, 9 ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment