__HEADER__(Iterate over powerset of clist) \ExplSyntaxOn %%% Iterate over powerset of claist \clist_new:N \l_powerset_copied_clist \seq_new:N \l_powerset_saved_seq \cs_generate_variant:Nn \clist_remove_all:Nn { N V } % Pseudocode of this macro % remove left -> push on stack % call recursive % add left to 'extra' % call recursive % remove left from 'extra' % add from stack to left \cs_new:Npn \__powerset_clist_foreach_aux:Nn #1 #2 { \clist_if_empty:NTF \l_powerset_copied_clist { #2 } { \clist_get:NN \l_powerset_copied_clist \l_tmpa_tl \seq_push:NV \l_powerset_saved_seq \l_tmpa_tl \clist_pop:NN \l_powerset_copied_clist { \l_tmpa_tl } \__powerset_clist_foreach_aux:Nn #1 {#2} \seq_get:NN \l_powerset_saved_seq \l_tmpa_tl \clist_put_left:NV #1 \l_tmpa_tl \__powerset_clist_foreach_aux:Nn #1 {#2} \seq_get:NN \l_powerset_saved_seq \l_tmpa_tl \clist_remove_all:NV #1 \l_tmpa_tl \clist_push:NV \l_powerset_copied_clist \l_tmpa_tl \seq_pop:NN \l_powerset_saved_seq \l_tmpa_tl } } % Usage: % \clist_use_powerset:Nn {clist variable name}{code for each subset} % This will execute #2 for each subset of the listname given as #1 % In #2, the name given as #1 can be used for the current subset % After execution, the value of #1 is restored \cs_new:Npn \powerset_clist_foreach:Nn #1 #2 { \clist_set_eq:NN \l_powerset_copied_clist #1 \clist_clear:N #1 \clist_remove_duplicates:N \l_powerset_copied_clist \__powerset_clist_foreach_aux:Nn #1 {#2} \clist_set_eq:NN #1 \l_powerset_copied_clist }