package Ġsh mp . lang . utils ĊĊ Ċ fun Ġ< T > Ġlist Cartesian Product ( l : ĠList < Collection < T >> ): ĠList < List < T >> Ġ{ ĊĠĠĠ Ġif Ġ( l . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĊĠĠĠ Ġvar Ġresult Ġ= Ġl [ 0 ]. map Ġ{ ĠlistOf ( it ) Ġ} ĊĊĠĠĠ Ġfor Ġ( cl Ġin Ġl . drop ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġcart esian Product ( result , Ġcl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( list , Ġelem ) Ġ-> ĠlistOf ( elem ) Ġ+ Ġlist Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġ< T > ĠList < Collection < T >> . cart esian Product () Ġ= Ġlist Cartesian Product ( this ) ĊĊ Ċ fun Ġ< T , ĠU > Ġcart esian Product ( c 1 : ĠCollection < T >, Ġc 2 : ĠCollection < U >): ĠList < Pair < T , ĠU >> Ġ{ ĊĠĠĠ Ġreturn Ġc 1 . flatMap Ġ{ Ġlhs Elem Ġ-> Ġc 2 . map Ġ{ Ġrhs Elem Ġ-> Ġlhs Elem Ġto Ġrhs Elem Ġ} Ġ} Ċ } Ċ