前の記事のついでにやってみた。
多重ループとかの時に便利そう。
// 直積を返すジェネレータの内部再帰関数
const innerProdG = selected => (xs, ...xss) => function*(){
if (xs === undefined ) {
yield selected
return
}
for (const x of xs) yield* innerProdG( [...selected, x] )( ...xss )
}()
// 複数の配列をとって直積を返すジェネレータ
const prodG =
innerProdG([])
// 使用例:
const a = [0, 1]
const b = [2, 3]
const c = [4, 5]
for(const e of prodG(a, b, c)) console.log(e)
/*
[ 0, 2, 4 ]
[ 0, 2, 5 ]
[ 0, 3, 4 ]
[ 0, 3, 5 ]
[ 1, 2, 4 ]
[ 1, 2, 5 ]
[ 1, 3, 4 ]
[ 1, 3, 5 ]
*/