%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Copyright © 2022 Maximilian Keßler % % This work may be distributed and/or modified % % 1. under the LaTeX Project Public License and/or % 2. under the GNU General Public License % % Distribution under conditions of the LaTeX Project Public License, % requires either version 1.3 of this license or (at your option) % any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status \`maintained'. % % The Current Maintainer of this work is Maximilian Keßler. % % % Distribution under the GNU General Public License requires either % version 3 or (at your opinion) any later version. % % This package has been generated by PyTeX, available at % https://github.com/kesslermaximilian/PyTeX % and built from source file 'powerset.pysty3'. % It is STRONGLY DISCOURAGED to edit this source file directly, since local % changes will not be versioned by Git and overwritten by the next build. Always % edit the source file and build the package again. % % Build details: % PyTeX version: v1.2.0-28-ge661cee (commit e661cee) % Source code version: v2.8 (commit 1d48178) % % This LaTeX package is free software and is dual-licensed % under the LPPLv1.3c and the GPLv3 licenses. % You may use it freely for your purposes. % The latest version of the package sources can be obtained % via GitLab under % https://gitlab.com/latexci/packages/LatexPackages % The latest version of the built packages can be obtained via GitLab under % https://gitlab.com/latexci/packages/LatexPackagesBuild % For further information see the urls above. % Reportings of bugs, suggestions and improvements are welcome, see the README % at the Git repository for further information. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ProvidesExplPackage{mkessler-powerset}{2022/01/24}{2.8}{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 }