% \iffalse meta-comment
% !TEX program  = pdfLaTeX
%<*internal>
\iffalse
%</internal>
%<*readme>
----------------------------------------------------------------
erw-l3 --- Utilities built around expl3
Source repository: https://github.com/rogard/erw-l3
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------

%</readme>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
----------------------------------------------------------------
erw-l3 Utilities built around expl3 
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------

\endpreamble
\postamble

Copyright (C) 2018 by Erwann Rogard

This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
version 1.3c of this license or (at your option) any later
version.  The latest version of this license is in the file:

http://www.latex-project.org/lppl.txt

This work is "maintained" (as per LPPL maintenance status) by
Erwann Rogard.

This work consists of the file  erw-l3.dtx
and the derived files   erw-l3.ins,
                                erw-l3.pdf and
                                erw-l3.sty.

\endpostamble
\generate{
  \file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\generate{
  \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\generate{
  \file{README.txt}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
%<package>\RequirePackage{expl3}[2018/06/01]
%<package>\RequirePackage{xparse}[2018/02/01]
%<package>\RequirePackage{l3keys2e}
%<package>\ProvidesExplPackage
%<package>  {erw-l3}                            % Package name
%<package>  {2020/02/05}                        % Release date
%<package>  {0.1.6}                             % Release version
%<package>  {Utilities built around expl3}      % Description
%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{erw-l3}
\usepackage{float}
\usepackage{tabto}
\usepackage{cleveref}
\ExplSyntaxOn
\tl_gset:Nn \partname {Part}
\ExplSyntaxOff
\EnableCrossrefs
\CodelineIndex
\RecordChanges
% \AtEndDocument { \PrintChanges \PrintIndex } % TODO
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \GetFileInfo{\jobname.sty}
%
%
%\title{^^A
%  \textsf{erw-l3}\thanks{^^A
%    This file describes version \fileversion, last revised \filedate.^^A
%  }^^A
%}
%\author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
%
%
%\date{Released \filedate}
%
%\maketitle
%
%\begin{abstract}\LaTeX3 package defining commands built around \pkg{expl3}\cite{interface3}.
% For example, \cs{erw_compose} implements the mathematical concept $f_1 \circ f_2 \dots \circ f_n$. 
%\end{abstract}
%
% \tableofcontents 
%
% \section*{Conventions}
%
% The naming conventions are (loosely) those of \LaTeX3.
% For example,  \meta{cs} stands for \emph{control sequence}, which is described in \cite[Part~\pkg{l3basics}]{interface3}. 
%
% \section*{Requirement}
%
% Have \file{erw-l3.sty} is in the path of the \LaTeX~engine. 
%
% \part{Usage}\label{part:usage}
%
% In the preamble of \cs{documentclass}, put: 
% \begin{center}
% \cs{usepackage}\oarg{options}|{|\pkg{erw-l3}|}|\linebreak
% \end{center}
%
% \section{\textsf{compose}} 
%
% \subsection{\textsf{backend}}
%
% \begin{function}{\erw_compose:nV,\erw_compose:nn}
%   \begin{syntax}
%     \cs{erw_compose:nV}\marg{cs list}\meta{var}
%   \end{syntax} Implements the mathematical concept $f_1 \circ  f_2  \dots \circ f_n$.
% See Listing~\autoref{listng:compose}
% \end{function}
%
% \begin{function}{\erw_compose_c:nV,\erw_compose_c:nn}
%   \begin{syntax}
%     \cs{erw_compose_c:nV}\marg{cs names}\meta{var}
%   \end{syntax} 
% See Listing~\autoref{listng:compose:c}
% \end{function}
%
% \begin{function}{\erw_compose_seq:nV}
%   \begin{syntax}
%     \cs{erw_compose_seq:nV}\marg{cs list}\meta{seq}
%   \end{syntax} Same as \cs{erw_compose:nV}, but saves each intermediary step
% See Listing~\autoref{listng:compose:seq}
% \end{function}
%
% \begin{function}{\erw_compose_seq_c:nV}
%   \begin{syntax}
%     \cs{erw_compose_seq_c:nV}\marg{cs names}\meta{seq}
%   \end{syntax}
% See Listing~\autoref{listng:compose:seq:c}
% \end{function}
%
% \begin{function}{\erw_compose_vers:nV,\erw_compose_vers:nn}
%   \begin{syntax}
%     \cs{erw_compose_vers:nV}\marg{list of cs or code}\meta{var}
%   \end{syntax}
%  See Listing~\autoref{listng:compose:vers}.
%  Only the |nn| version is implemented
%  \end{function}
%
% \begin{function}{\erw_compose_seq_vers:nV,\erw_compose_seq_vers:nn}
%   \begin{syntax}
%     \cs{erw_compose_seq_vers:nV}\marg{list of cs or code}\meta{seq}
%   \end{syntax}
%  {\color{red}Not implemented}
%  \end{function}
%
% \section{\textsf{csutil}} 
%
% \subsection{\textsf{backend}}
%
% \begin{function}{\erw_accum:nn}
%    \begin{syntax}{\cs{erw_accum:nn}}\marg{token list}\marg{item}
%     \end{syntax}Expands to a token list comprising the items of \meta{token list} and \meta{item}
% \end{function}
%
% \begin{function}{\erw_apply:Nn, \erw_apply:cn, \erw_apply:Nnn, \erw_apply:Nnnn, \erw_apply:Nnnnn}
%    \begin{syntax}{\cs{erw_apply:Nn}}\meta{cs}\marg{arg}
%     \end{syntax}Expands to \meta{cs}\marg{arg}
% \end{function}
%
%  \begin{function}{\erw_cs_set_eq:NN, \erw_cs_set_eq:cN,\erw_cs_gset_eq:NN, \erw_cs_gset_eq:cN}
%     \begin{syntax}{\cs{erw_cs_set_eq:NN}}\meta{cs1}\meta{cs2}
%     \end{syntax}\meta{cs1}\textleftarrow\meta{cs2}
%  \end{function}
%
%  \begin{function}{\erw_cs_set_inline:Nn, \erw_cs_set_inline:cn,\erw_cs_gset_inline:Nn, \erw_cs_gset_inline:cn}
%     \begin{syntax}{\cs{erw_cs_set_inline:Nn}}\meta{cs}\marg{code}
%     \end{syntax}
%  \end{function}
%
%  \begin{function}{\erw_identity:n}
%     \begin{syntax}{\cs{erw_identity:n}}\marg{arg}
%     \end{syntax} Expands to \meta{arg}
%  \end{function}
%
%  \begin{function}{\erw_is_matrix_p:n,\erw_is_matrix:nTF}
%     \begin{syntax}{\cs{erw_is_matrix_p:n}}\marg{token list}
%     \end{syntax} Checks if \meta{token list} is a (square) matrix.
%  \end{function}
%
% \begin{function}{\erw_fold:NV, \erw_fold:cV}
%    \begin{syntax}{\cs{erw_fold:NV}}\meta{cs}\meta{var}
%     \end{syntax}\meta{var}\textleftarrow \cs{erw_apply:NV}\meta{cs}\meta{var}.
% See Listing~\autoref{listng:fold}. 
% \end{function}
%
% \begin{function}{\erw_last_item:nn}
%    \begin{syntax}{\cs{erw_last_item:nn}}\marg{int}\marg{token list}
%    \end{syntax} ^^ASee Listing~\autoref{listng:items}
% \end{function}
%
% \begin{function}{\erw_merge:nn}
%    \begin{syntax}{\cs{erw_merge:nn}}\marg{tl 1}\marg{tl 2}
%     \end{syntax}Merges \meta{tl 1}\meta{tl 2}
% \end{function}
%
% \begin{function}{\erw_repeat:nn}
%    \begin{syntax}{\cs{erw_repeat:nn}}\marg{int}\marg{value}
%    \end{syntax}
% See Listing~\autoref{listng:repeat}
% \end{function}
%
% \begin{function}{\erw_split:nn}
%    \begin{syntax}{\cs{erw_split:nn}}\marg{token list}\marg{delimiter}
%    \end{syntax} See Listing~\autoref{listng:split}
% \end{function}
%
% \section{\textsf{int}} 
%
% \subsection{\textsf{backend}}
%
% \begin{function}{\erw_int_range:nn}
%    \begin{syntax}{\cs{erw_int_range:nn}}\marg{first}{last}
%     \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline} 
% \end{function}
%
% \begin{function}{\erw_int_range:n}
%    \begin{syntax}{\cs{erw_int_range:n}}\marg{count}
%     \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline}. See Listing~\autoref{listng:int:range}
% \end{function}
%
% \section{\textsf{map}} 
%
% \subsection{\textsf{backend}}
%
% \begin{function}{\erw_set_map:N,\erw_gset_map:N}
%    \begin{syntax}{\cs{erw_set_map:N}}\meta{cs}
%     \end{syntax} Sets the function used by \cs{erw_map:n}.
% \end{function}
%
% \begin{function}{\erw_set_map_inline:n,\erw_gset_map_inline:n}
%    \begin{syntax}{\cs{erw_set_map_inline:n}}\marg{code}
%     \end{syntax} Sets the function used by \cs{erw_map:n}.
% \end{function}
%
% \begin{function}{\erw_map:n}
%    \begin{syntax}{\cs{erw_map:n}}\marg{token list}
%     \end{syntax} Applies the stored \meta{cs} to each item in \meta{token list}.  An application is \cs{erw_is_matrix} 
% \end{function}
%
% \begin{function}{\erw_map:Nn}
%    \begin{syntax}{\cs{erw_map:Nn}}\meta{cs}\marg{token list}
%     \end{syntax}
% See Listing~\autoref{listng:map}.
% Redundant with \cs{tl_map_function:nN}
% \end{function}
%
% \begin{function}{\erw_map_inline:nn}
%    \begin{syntax}{\cs{erw_map_inline:nn}}\marg{code}\marg{args}
%     \end{syntax}
% See Listing~\autoref{listng:mapinl}
% \end{function}
%
% \begin{function}{\erw_map_indexed:Nnn}
%    \begin{syntax}{\cs{erw_map_indexed:Nnn}}\meta{cs}\marg{int}\marg{matrix of tokens} 
%    \end{syntax} {\color{red} Not implemented}. See Listing~\autoref{listng:mapindexed}.
% \end{function}
%
% \begin{function}{\erw_map_thread:Nn}
%    \begin{syntax}{\cs{erw_map_thread:Nn}}\meta{cs}\marg{matrix of tokens} 
%    \end{syntax} Threads \meta{cs} over the columns, where the arity of \meta{cs} must be equal to the number of rows.
% See Listing~\autoref{listng:thread}
% \end{function}
%
% \begin{function}{\erw_map_thread_at:Nnn}
%    \begin{syntax}{\cs{erw_map_thread_at:Nnn}}\meta{cs}\marg{matrix of tokens}
%    \end{syntax}  
% \end{function}
%
% \section{\textsf{numbrdcs}}
%
% \subsection{backend}
%
% \begin{function}{\erw_numbrd_cs_reset:}
%   \begin{syntax}\cs{erw_numbrd_cs_reset:}|{}|
%   \end{syntax} See Listing~\ref{listng:numbrdcs:names}
% \end{function}
%
% \begin{function}{ \erw_numbrd_cs_new:n}
%   \begin{syntax}\cs{erw_numbrd_cs_new:n} \marg{cs or code}
%   \end{syntax} Use it as the first arg to \cs{tl_function_map:Nn}
% \end{function}
%
% \begin{function}{ \erw_numbrd_cs:nn}
%   \begin{syntax}\cs{erw_numbrd_cs:nn} \marg{cs or code}
%   \end{syntax} 
% \end{function}
%
% \begin{function}{\erw_numbrd_cs_names_braced:nnn}
%   \begin{syntax}\cs{erw_numbrd_cs_names_braced:nnn}\marg{first}\marg{step}\marg{last}
%   \end{syntax}See Listing~\ref{listng:numbrdcs:names}
% \end{function}
%
% \subsection{frontend}
%
% \begin{function}{\numbrdcsnew,\numbrdcsnew*}
%   \begin{syntax}\cs{numbrdcsnew}\marg{list of cs or code}
%   \end{syntax} Creates numbered control sequences. The starred version does not reset. See Listing~\ref{listng:numbrdcs}
% \end{function}
%
% \begin{function}{\numbrdcs}
%   \begin{syntax}\cs{numbrdcs}\marg{int}\marg{arg}
%   \end{syntax} Evaluates control sequence numbered \meta{int} with argument \meta{arg}. See Listing~\ref{listng:numbrdcs}
% \end{function}
%
% \clearpage
%
% \part{Listings}\label{part:listng}
%
% \floatstyle{ruled}
% \newfloat{Listing}{H}{lop}
% \NewDocumentCommand{\erwtab}{O{0.5}}{\tabto{#1\linewidth}}
%
% \section{compose}
%
% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\erwtab\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\erwtab\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
% \\\verb|\erw_compose:nV{|
% \\\verb|  {\__baz}{\__bar}{\__foo}}|
% \\\verb|  \l_tmpa_tl|\erwtab\erw_compose:nV{{\__baz}{\__bar}{\__foo}}\l_tmpa_tl
% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\tl_set:Nn \l_tmpa_tl{X}
% \\\verb|\erw_compose:nn{|
% \\\verb|  {\__baz}{\__bar}{\__foo}}|
% \\\verb|  {X}|\erwtab\erw_compose:nn{{\__baz}{\__bar}{\__foo}}{X}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:compose}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\tl_set:Nn \l_tmpa_tl{X}
% \\\verb|\erw_compose_c:nV{|
% \\\verb|  {__baz}{__bar}{__foo}}|
% \\\verb|  \l_tmpa_tl|\erwtab\erw_compose_c:nV{{__baz}{__bar}{__foo}}\l_tmpa_tl
% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
% \\\verb|\erw_compose_c:nn{|
% \\\verb|  {__baz}{__bar}{__foo}}|
% \\\verb|  {X}|\erwtab\erw_compose_c:nn{{__baz}{__bar}{__foo}}{X}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:compose:c}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\seq_new:N\l_tmp_seq|\erwtab\seq_new:N \l_tmp_seq
% \\\verb|\seq_put_right:Nn\l_tmp_seq{X}|\erwtab\seq_put_right:Nn \l_tmp_seq{X}
% \\\verb|  \erw_compose_seq:nV{|
% \\\verb|    {\__baz}{\__bar}{\__foo}}|
% \\\verb|    \l_tmp_seq|\erwtab \erw_compose_seq:nV{{\__baz}{\__bar}{\__foo}}\l_tmp_seq
% \\\verb|\seq_item:Nn\l_tmp_seq{1}|\erwtab \seq_item:Nn \l_tmp_seq{1}
% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{}\label{listng:compose:seq}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\seq_new:N\l_tmp_seq|
% \\\verb|\seq_put_right:Nn\l_tmp_seq{X}|\erwtab\seq_put_right:Nn \l_tmp_seq{X}
% \\\verb|\erw_compose_seq_c:nV{|
% \\\verb|  {__baz}{__bar}{__foo}}|
% \\\verb|  \l_tmp_seq|\erwtab \erw_compose_seq_c:nV{{__baz}{__bar}{__foo}}\l_tmp_seq
% \\\verb|\seq_item:Nn\l_tmp_seq{1}|\erwtab \seq_item:Nn \l_tmp_seq{1}
% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{}\label{listng:compose:seq:c}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\erw_compose_vers:nn{|
% \\\verb|  {\__baz}{g[#1]}{\__foo}}|
% \\\verb|  {X}|\erwtab\erw_compose_vers:nn{{\__baz}{g[#1]}{\__foo}}{X}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{}\label{listng:compose:vers}
% \end{Listing}
%
% \section{csutil}
%
% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\erw_apply:Nn\__foo{X}|\erwtab\erw_apply:Nn\__foo{X}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:apply}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
% \\\verb|\erw_fold_set_par:n{Nf}|\erw_fold_set_par:n{Nf}
% \\\verb|\erw_fold_apply_par:n{Nf}|\erw_fold_apply_par:n{Nf}
% \\\verb|\erw_fold:NV\__foo\l_tmpa_tl|\erwtab\erw_fold:NV\__foo\l_tmpa_tl
% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
% \\\verb|\cs_set:Npn\__bar #1 {g[#1]}|\erwtab\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\erw_fold:cV{__bar}\l_tmpa_tl|\erwtab\erw_fold:cV {__bar}\l_tmpa_tl
% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:fold}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
% \\\verb|\erw_is_matrix:nTF|
% \\\verb|{|
% \\\verb|        { {a}{b}{c} }|
% \\\verb|        { {k}{l}{m} }|
% \\\verb|        { {x}{y}{z} }|
% \\\verb|}{T}{F}|\erwtab\erw_is_matrix:nTF
% {
%     { {a}{b}{c} }
%     { {k}{l}{m} }
%     { {x}{y}{z} }
% }{T}{F}
% \\\verb|\erw_is_matrix:nTF|
% \\\verb|{|
% \\\verb|        { {a}{c} }|
% \\\verb|        { {k} }|
% \\\verb|        { {x}{y}{z} }|
% \\\verb|}{T}{F}|\erwtab
% \erw_is_matrix:nTF
% {
%     { {a}{c} }
%     { {k} }
%     { {x}{y}{z} }
% }{T}{F}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:ismatrix}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
% \\\verb|\erw_repeat:nn|
% \\\verb|  {3}{abracad}abra| \erwtab \erw_repeat:nn{3}{abracad}abra
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:repeat}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
% \\\verb|\erw_split:nn|
% \\\verb|  {{a}{b}{c}}{==}| \erwtab \erw_split:nn{{a}{b}{c}}{==}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:split}
% \end{Listing}
%
% \section{\textsf{int}}
%
% \subsection{\textsf{backend}}
%
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\erw_int_range:nn{2}{5}|\erwtab\erw_int_range:nn{2}{5}
% \\\verb|\erw_int_range:n{5}|\erwtab\erw_int_range:n{5}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:int:range}
% \end{Listing}
%
% \section{\textsf{map}}
%
% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
% \\\verb|\erw_map:Nn \__foo{{a}{b}{c}}|\erwtab\erw_map:Nn \__foo{{a}{b}{c}}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:map}
% \end{Listing}
% 
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
% \\\verb|\erw_map_inline:nn{|
% \\\verb|  (#1)}{{a}{b}{c}}| \erwtab\erw_map_inline:nn{(#1)}{{a}{b}{c}}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:mapinl}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\cs_set:Npn \__foo:n #1 {(#1)}|\cs_set:Npn \__foo:n #1 {(#1)}
% \\\verb|\erw_map_thread:Nn \__foo:n|
% \\\verb|{|
% \\\verb|     {{a}{b}{c}{d}{e}{f}}|
% \\\verb|}|\erwtab\erw_map_thread:Nn \__foo:n
% { 
%     {{a}{b}{c}{d}{e}{f}}
% }
% \\\verb|\cs_set:Npn \__foo:nn  #1 #2|
% \\\verb|     {(#1+#2)}|\cs_set:Npn \__foo:nn #1 #2 {(#1+#2)}
% \\\verb|\erw_map_thread:Nn \__foo:nn|
% \\\verb|{|
% \\\verb|     {{a}{b}{c}{d}{e}{f}}|
% \\\verb|     {{A}{B}{C}{D}{E}{F}}|
% \\\verb|}|\erwtab\erw_map_thread:Nn \__foo:nn
% { 
%         {{a}{b}{c}{d}{e}{f}}
%         {{A}{B}{C}{D}{E}{F}}
% }
% \\\verb|\cs_set:Npn \__foo:nnn|
% \\\verb|     #1 #2 #3 |
% \\\verb|    {(#1+#2+#3)}|\cs_set:Npn \__foo:nnn #1 #2 #3 {(#1+#2+#3)}
% \\\verb|\erw_map_thread:Nn \__foo:nnn|
% \\\verb|{|
% \\\verb|     {{a}{b}{c}{d}{e}{f}}|
% \\\verb|     {{A}{B}{C}{D}{E}{F}}|
% \\\verb|     {{k}{l}{m}{n}{o}{p}}|
% \\\verb|}|\erwtab[0.3]\erw_map_thread:Nn \__foo:nnn
% { 
%         {{a}{b}{c}{d}{e}{f}}
%         {{A}{B}{C}{D}{E}{F}}
%         {{k}{l}{m}{n}{o}{p}}
% }
% \\\verb|\cs_set:Npn \__foo:nnnn|
% \\\verb|     #1 #2 #3 #4 |
% \\\verb|    {(#1+#2+#3+#4)}|\cs_set:Npn \__foo:nnnn #1 #2 #3 #4 {(#1+#2+#3+#4)}
% \\\verb|\erw_map_thread:Nn \__foo:nnnn|
% \\\verb|{|
% \\\verb|     {{a}{b}{c}{d}{e}{f}}|
% \\\verb|     {{A}{B}{C}{D}{E}{F}}|
% \\\verb|     {{k}{l}{m}{n}{o}{p}}|
% \\\verb|     {{K}{L}{M}{N}{O}{P}}|
% \\\verb|}|\erwtab[0.1]\erw_map_thread:Nn \__foo:nnnn
% { 
%         {{a}{b}{c}{d}{e}{f}}
%         {{A}{B}{C}{D}{E}{F}}
%         {{k}{l}{m}{n}{o}{p}}
%         {{K}{L}{M}{N}{O}{P}}
% }
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:thread}
% \end{Listing}
%
% \begin{Listing}
% \verb|\ExplSyntaxOn|\ExplSyntaxOn
% \\\verb|\cs_set_protected:Npn \__foo:nn #1 #2|
% \\\verb|    {(#1+#2)}| \cs_set_protected:Npn \__foo:nn #1 #2 {(#1+#2)}
% \\\verb|\erw_map_thread:Nn|
% \\\verb|    \__foo:nn |
% \\\verb|        { |
% \\\verb|            {{1}{2}{3}} |
% \\\verb|            {{a}{b}{c}}|
% \\\verb|        }|\erwtab\erw_map_thread:Nn
%     \__foo:nn 
%     { 
%         {{1}{2}{3}} 
%         {{a}{b}{c}}
%     }
% \\\verb|\exp_last_unbraced:Nx|
% \\\verb|\erw_map_thread:Nn|
% \\\verb|{|
% \\\verb|        \__foo:nn |
% \\\verb|        { |
% \\\verb|            {\erw_int_range:n{3}} |
% \\\verb|            {{a}{b}{c}}|
% \\\verb|        }|
% \\\verb|}| \erwtab
% \exp_last_unbraced:Nx
% \erw_map_thread:Nn
% {
%     \__foo:nn 
%     { 
%         {\erw_int_range:n{3}} 
%         {{a}{b}{c}}
%     }
% }\erwtab[0.7]{\color{red} (does~not~thread!)}
% \\\verb|\exp_last_unbraced:Nx|
% \\\verb|\erw_map_thread:Nn|
% \\\verb|{|
% \\\verb|        \__foo:nn |
% \\\verb|        { |
% \\\verb|            {\int_step_inline:nn{3}{#1}} |
% \\\verb|            {{a}{b}{c}}|
% \\\verb|        }|
% \\\verb|}| 
% \erwtab[0.2]{\color{red} \verb|Illegal parameter number in definition of \l__exp_internal_tl!|}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{Debugging~for~\cs{erw_map_indexed}}\label{listng:mapindexed}
% \end{Listing}
%
% \section{\textsf{numbrdcs}}
%
% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\NewDocumentCommand{\myfoo}{m}{f(#1)}|\NewDocumentCommand{\myfoo}{m}{f(#1)}
% \\\verb|\NewDocumentCommand{\mybar}{m}{g[#1]}|\NewDocumentCommand{\mybar}{m}{g[#1]}
% \\\verb|\NewDocumentCommand{\mybaz}{m}{h\{#1\}}|\NewDocumentCommand{\mybaz}{m}{h\{#1\}}
% \\\verb|\numbrdcsnew{{\mybaz}{g[#1]}{\myfoo}}|\numbrdcsnew{{\mybaz}{g[#1]}{\myfoo}}
% \\\verb|\ExplSyntaxOn|
% \\\verb|\exp_last_unbraced:Nx|
% \\\verb|  \erw_compose_c:nn|
% \\\verb|  {|
% \\\verb|    {\erw_numbrd_cs_names_braced:|
% \\\verb|         nnn{1}{1}{3}}|
% \\\verb|    {X}|
% \\\verb|  }|
% \\\verb|\ExplSyntaxOff|\erwtab
% \ExplSyntaxOn
% \exp_last_unbraced:Nx
%   \erw_compose_c:nn
%   {{\erw_numbrd_cs_names_braced:nnn{1}{1}{3}}
%   {X}}
% \ExplSyntaxOff
% \caption{ }\label{listng:numbrdcs:names}
% \end{Listing}
%
% \subsection{frontend}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\NewDocumentCommand{\thefoo}{m}{f(#1)}|\NewDocumentCommand{\thefoo}{m}{f(#1)}
% \\\verb|\NewDocumentCommand{\thebar}{m}{g[#1]}|\NewDocumentCommand{\thebar}{m}{g[#1]}
% \\\verb|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}
% \\\verb|\numbrdcsnew{|
% \\\verb|    {\thefoo}|
% \\\verb|    {g[#1]}|
% \\\verb|    {\thebaz}}|\erwtab\numbrdcsnew{{\thefoo}{g[#1]}{\thebaz}}
% \\\verb|\numbrdcs{1}{X}|\erwtab\numbrdcs{1}{X}
% \\\verb|\numbrdcs{2}{X}|\erwtab\numbrdcs{2}{X}
% \\\verb|\numbrdcs{3}{X}|\erwtab\numbrdcs{3}{X}
% \\\verb|\numbrdcsnew*{|
% \\\verb|    {\thefoo}|
% \\\verb|    {g[#1]}|
% \\\verb|    {\thebaz}}|\erwtab\numbrdcsnew*{{\thefoo}{g[#1]}{\thebaz}}
% \\\verb|\numbrdcs{4}{X}|\erwtab\numbrdcs{4}{X}
% \\\verb|\numbrdcs{5}{X}|\erwtab\numbrdcs{5}{X}
% \\\verb|\numbrdcs{6}{X}|\erwtab\numbrdcs{6}{X}
% \caption{ }\label{listng:numbrdcs}
% \end{Listing}
%
%
%\StopEventually{^^A
%  \PrintChanges
%  \PrintIndex
%}
% 
% \part{Implementation}\label{part:impl}
%
% \iffalse
%<*package>
% \fi
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ExplSyntaxOn
\msg_new:nnn{erw}{generic}{#1}
%    \end{macrocode}
% \section{\textsf{compose}} 
% \subsection{backend} 
%    \begin{macrocode}
\cs_set:Npn \erw_compose:NnV 
  #1 % method
  #2 % funs
  #3 % var
{
  \erw_fold_set_par:n{Nf}
  \erw_fold_apply_par:n{Nf}
  \erw_cs_set_inline:Nn \__erw_map:n
  {
     #1{##1}#3
  }
  \exp_args:Nf\erw_map:n
  {
      \tl_reverse:n{#2}
  }
}
\cs_set:Npn \erw_compose:nV #1 #2 
{
  \erw_compose:NnV \erw_fold:NV {#1} #2
}
\cs_set:Npn \erw_compose_c:nV #1 #2 
{
  \erw_compose:NnV \erw_fold:cV {#1} #2
}
\tl_new:N \__erw_compose_tl
\cs_set:Npn \erw_compose:nn #1 #2
{
  \tl_set:Nn \__erw_compose_tl {#2}
  \erw_compose:nV{#1}\__erw_compose_tl
  \__erw_compose_tl
}
\cs_set:Npn \erw_compose_c:nn #1 #2 
{
  \tl_set:Nn \__erw_compose_tl {#2}
  \erw_compose_c:nV{#1}\__erw_compose_tl
  \__erw_compose_tl
}
\cs_set:Npn \erw_compose_seq:nV #1 #2
{
  \erw_compose:NnV \erw_fold_seq:NV {#1} #2
}
\cs_set:Npn \erw_compose_seq_c:nV
  #1 % funs 
  #2 % seq
{
  \erw_compose:NnV \erw_fold_seq:cV {#1} #2
}
\cs_set:Npn \erw_compose_vers:nV #1 #2
{
   \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented}
}
\cs_set:Npn \erw_compose_seq_vers:nV #1 #2
{
   \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented}
}
\cs_set:Npn \erw_compose_vers:nn #1 #2
{
   \erw_numbrd_cs_reset:{}
      \tl_map_function:nN{#1}\erw_numbrd_cs_new:n
      \exp_last_unbraced:Nx
      \erw_compose_c:nn
         {{\erw_numbrd_cs_names_braced:{}}}
         {#2}
}
%    \end{macrocode}
% \section{\textsf{csutil}} 
% \subsection{\textsf{backend}} 
%    \begin{macrocode}
\cs_set:Npn \erw_accum:nn #1 #2
{
    {#1{#2}}
}
\cs_set:Npn \__erw_cs_name:N #1
{
    \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1}
}
\cs_set:Npn \erw_apply:Nn 
  #1 % fun
  #2 % tl
{
  #1{#2}
}
\cs_generate_variant:Nn \erw_apply:Nn {No, Nf, Nx, c}
\cs_set:Npn \erw_cs_set_eq:NN #1 #2
{
  \cs_set:Npn #1 ##1{#2{##1}}
}
\cs_generate_variant:Nn \erw_cs_set_eq:NN {cN}
\cs_set:Npn \erw_cs_gset_eq:NN #1 #2
{
  \cs_gset:Npn #1 ##1{#2{##1}}
}
\cs_generate_variant:Nn \erw_cs_gset_eq:NN {cN}
\cs_set:Npn \erw_cs_set_inline:Nn #1 #2
{
  \cs_set:Npn #1 ##1{#2}
}
\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn}
\cs_set:Npn \erw_cs_gset_inline:Nn #1 #2
{
  \cs_gset:Npn #1 ##1{#2}
}
\cs_generate_variant:Nn \erw_cs_gset_inline:Nn {cn}
\tl_set:Nn \__erw_fold_set_par_tl{\c_novalue_tl}
\tl_set:Nn \__erw_fold_apply_par_tl{\c_novalue_tl}
\cs_set:Npn \erw_fold_set_par:n #1
{
  \tl_set:Nn \__erw_fold_set_par_tl{#1}
}
\cs_set:Npn \erw_fold_apply_par:n #1
{
  \tl_set:Nn \__erw_fold_apply_par_tl{#1}  
}
\cs_set:Npn \erw_fold:NV 
  #1 % fun 
  #2 % var
{
  \use:c{tl_set:\__erw_fold_set_par_tl}
     #2
    {\use:c{erw_apply:\__erw_fold_apply_par_tl}{#1}{#2}}
}
\cs_generate_variant:Nn \erw_fold:NV {cV}
\tl_new:N \__erw_fold_seq_item_tl
\cs_set:Npn \erw_fold_seq:NV 
  #1 % fun 
  #2 % seq
{
  \seq_get_right:NN #2 \__erw_fold_seq_item_tl
  \erw_fold:NV #1 \__erw_fold_seq_item_tl
  \seq_put_right:No #2 {\__erw_fold_seq_item_tl}
}
\cs_generate_variant:Nn \erw_fold_seq:NV {cV}
\cs_set:Npn \erw_identity:n #1{#1}
\prg_set_conditional:Npnn \erw_is_matrix:n #1 { p, TF }
{
    \erw_gset_map_inline:n{==\tl_count:n{##1}}
    \int_compare:nTF
    {
        \exp_args:Nf\tl_count:n{\tl_head:n{#1}}
        \exp_args:Nf \erw_map:n 
        {
                \tl_tail:n{#1}
            }
    }
    {\prg_return_true:}
    {\prg_return_false:}
}
% Deprecated in v0.1.4 after realizing \cs{tl_range:n} does the job
%\cs_set:Npn\__erw_items_to:nnn #1 #2 #3
%{
%    \int_compare:nNnTF
%    {#1}>{#2}
%    {
%        \exp_args:Nf \tl_head:n{#3}
%        \__erw_items_to:nnn
%            {#1}
%            {\int_eval:n{#2+1}}
%            {\exp_args:Nf \tl_tail:n{#3}}
%    }
%    {
%        \exp_args:Nf \tl_head:n{#3}
%    }
%}
%\cs_set:Npn \erw_items_to:nn #1 #2
%{
%    \__erw_items_to:nnn
%        {#1}
%        {1}
%        {#2}
%}
\cs_set:Npn \erw_last_item:n #1
{
    \exp_args:Nof \tl_item:nn
        {#1}
        {
            \tl_count:n{#1}
        }
}
\cs_set:Npn \erw_merge:nn #1 #2
{
    {#1#2}
}
\cs_set:Npn \erw_repeat:nn #1 #2
{
    \int_step_inline:nnnn{1}{1}{#1}{#2}
}
\cs_set:Npn \erw_split:nnn #1 #2 #3
{
    \tl_head:n{#1}
    \use:c{exp_args:#3} \tl_map_inline:nn 
    {
        \tl_tail:n
        {
            #1
        }
    }{#2##1}    
}
\cs_set:Npn \erw_split:nn #1 #2
{
    \erw_split:nnn{#1}{#2}{Nf}
}
%    \end{macrocode}
% \section{\textsf{map}} 
% \subsection{\textsf{backend}} 
%    \begin{macrocode}
\cs_set:Npn \__erw_int_range:nnn #1 #2 #3
{
    \int_compare:nNnTF
    {
            \int_eval:n{#2+1}
    }>{#3}
    { 
        {#1}
    }
    {
        \__erw_int_range:nnn
        {
            \exp_args:Nx\erw_accum:nn{#1}
            {
                \int_eval:n{#2+1}
            }
        }
        {\int_eval:n{#2+1}}
        {#3}
    }
}
\cs_set:Npn \erw_int_range:nn #1 #2
{
    \__erw_int_range:nnn {{#1}}{#1}{#2}
}
\cs_set:Npn \erw_int_range:n #1
{
    \__erw_int_range:nnn {}{0}{#1}
% Alt to:
%    \int_step_inline:nn {#1}{##1}
}
%    \end{macrocode}
% \section{\textsf{map}} 
% \subsection{\textsf{backend}} 
%    \begin{macrocode}
\cs_set:Npn \erw_gset_map:N #1
{
    \erw_cs_gset_eq:NN \__erw_map:n #1
}
\cs_set:Npn \erw_gset_map_inline:n #1
{
    \erw_cs_gset_inline:Nn \__erw_map:n {#1}
}
\cs_set:Npn \erw_map:n #1
{    
  \__erw_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop
}
\cs_set:Npn \__erw_map:nn #1 #2
{
  \quark_if_recursion_tail_stop:n{#1}  
  \__erw_map:n{#1}  \__erw_map:nn{#2}
}
\cs_new:Npn \__erw_map:n #1
{
  \msg_error:nnn
    {erw}
    {generic}
    {__erw_map:n~not~set}
}
\cs_set:Npn \erw_map:Nn 
  #1 % fun 
  #2 % tl
{
  \erw_cs_set_eq:NN \__erw_map:n #1
  \erw_map:n{#2}  
}
\cs_set:Npn \erw_map_inline:nn 
  #1 % inl 
  #2 % tl
{
  \erw_cs_set_inline:Nn \__erw_map:n {#1}
  \erw_map:n{#2}
}
\cs_set:Npn \erw_apply:Nnn #1 #2 #3
{
    #1{#2}{#3}
}
\cs_set:Npn \erw_apply:Nnnn #1 #2 #3 #4
{
    #1{#2}{#3}{#4}
}
\cs_set:Npn \erw_apply:Nnnnn #1 #2 #3 #4 #5
{
    #1{#2}{#3}{#4}{#5}
}
\cs_set:Npn \__erw_map_thread_at:Nnn #1 #2 #3
{ 
     \erw_apply:Nn #1
     {\exp_args:Nf\tl_item:nn {#3} {#2} }
}
\cs_set:Npn \__erw_map_thread_at:Nnnn #1 #2 #3 #4
{ 
     \erw_apply:Nnn #1
     {\exp_args:Nf\tl_item:nn {#3} {#2} }
     {\exp_args:Nf\tl_item:nn {#4} {#2} }
}
\cs_set:Npn \__erw_map_thread_at:Nnnnn #1 #2 #3 #4 #5
{ 
     \erw_apply:Nnnn #1
     {\exp_args:Nf\tl_item:nn {#3} {#2} }
     {\exp_args:Nf\tl_item:nn {#4} {#2} }
     {\exp_args:Nf\tl_item:nn {#5} {#2} }
}
\cs_set:Npn \__erw_map_thread_at:Nnnnnn #1 #2 #3 #4 #5 #6
{ 
     \erw_apply:Nnnnn #1
     {\exp_args:Nf\tl_item:nn {#3} {#2} }
     {\exp_args:Nf\tl_item:nn {#4} {#2} }
     {\exp_args:Nf\tl_item:nn {#5} {#2} }
     {\exp_args:Nf\tl_item:nn {#6} {#2} }
}
\cs_set:Npn \erw_map_thread_at:Nnn #1 #2 #3
{
    \exp_args:Nf\int_case:nnTF
    {
        \tl_count:n{#3}
    }
    {
        {1}{ \__erw_map_thread_at:Nnn #1{#2}#3 }
        {2}{ \__erw_map_thread_at:Nnnn #1{#2}#3 }
        {3}{ \__erw_map_thread_at:Nnnnn #1{#2}#3 }
        {4}{ \__erw_map_thread_at:Nnnnnn #1{#2}#3 }
    }
    {
        % Do nothing
    }
    {
        \msg_error:nnn{erw}
            {generic}
            {erw_map_thread_at:~count~of~#3~not~withing~1~to~4}        
    }
}
\cs_set:Npn \erw_map_thread:Nn #1 #2
{
    % TODO check that #2 is a matrix
    \int_step_inline:nn
    { 
        \exp_args:Nf \tl_count:n{ \tl_head:n{#2} } 
    }
    {
        \erw_map_thread_at:Nnn #1 {##1} {#2}
    }
}
%    \end{macrocode}
% \section{\textsf{numbrdcs}}
% \subsection{\textsf{backend}} 
%    \begin{macrocode}
\int_new:N \__erw_numbrd_cs_int
\cs_set:Npn \erw_numbrd_cs_name:n #1{__erw_numbrd_cs_\int_to_alph:n{#1}:n}
\cs_set:Npn \erw_numbrd_cs_name_braced:n #1{{\erw_numbrd_cs_name:n{#1}}}
\tl_set:Nn \__erw_numbrd_cs_name_tl {\erw_numbrd_cs_name:n{\__erw_numbrd_cs_int}}
\cs_set:Npn \erw_numbrd_cs:nn #1 #2
{
    \erw_apply:cn{__erw_numbrd_cs_\int_to_alph:n{#1}:n}{#2}
}
\cs_new_protected:Npn \erw_numbrd_cs_reset: 
{
    \int_zero:N \__erw_numbrd_cs_int
    \tl_set:Nn \__erw_numbrd_cs_ext_tl{}
}
\cs_new_protected:Npn \erw_numbrd_cs_new:n #1
{ 
    \int_incr:N \__erw_numbrd_cs_int
    \erw_cs_set_inline:cn{\__erw_numbrd_cs_name_tl}
    {
        \token_if_cs:NTF
            {#1}
            {#1{##1}}
            {#1}
    }
}
\cs_new:Npn \erw_numbrd_cs_names:nnn #1 #2 #3
{
    \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name:n
}
\cs_new:Npn \erw_numbrd_cs_names_braced:nnn #1 #2 #3
{
    \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name_braced:n
    % TODO \tl_range_braced:nnn?
}
\cs_new:Npn \erw_numbrd_cs_names_braced: 
{
    \erw_numbrd_cs_names_braced:nnn{1}{1}{\__erw_numbrd_cs_int}
}
%    \end{macrocode}
% \subsection{\textsf{frontend}} 
%    \begin{macrocode}
\NewDocumentCommand{\numbrdcsnew}{ s m }
{
    \IfBooleanTF{#1}
        {} 
        { \erw_numbrd_cs_reset:{}}
    \tl_map_function:nN {#2}\erw_numbrd_cs_new:n
}
\NewDocumentCommand{\numbrdcs}{ m m }
{
    \erw_numbrd_cs:nn{#1}{#2}
}
% \ProcessKeysPackageOptions{ erw }
\ExplSyntaxOff
%    \end{macrocode}
% \part{Other}\label{part:other}
%
% \section{Support}\label{support}
%
% This package is available from \url{https://www.ctan.org/pkg/erw-l3} (release) or \url{https://github.com/rogard/erw-l3} (development) where you can report issues. 
%
% \section{To do}\label{todo}
%
% \begin{itemize}
% \item Missing variants of \cs{erw_compose}
% \item \cs{erw_map_indexed}. See Listing~\autoref{listng:mapindexed}
% \item Need to give some thought to `protected'
% \end{itemize}
%
% \section{Acknowledgment} 
% I thank those that have answered my questions on forums pertaining to \LaTeX3. See here: \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
% and here: \url{https://latex.org/forum/memberlist.php?mode=viewprofile&u=61329}
%
% ^^A \section{Change history}
% ^^A TODO Bring the change history under this section
% ^^A The versions showns are of those of the development stage, some may have been skipped in the release.
% ^^A \iffalse 
% ^^A : changes
% ^^A \fi
%
% \changes{0.1}{2018/05/20}{Initial version} 
% \changes{0.1.1}{2018/05/23}{}
% \changes{0.1.1}{2018/05/23}{Brought all the modules under one file; renamed \pkg{l3erw} to \pkg{erw-l3};}
% \changes{0.1.1}{2018/05/23}{\pkg{disambig}/backend: changes to the key, added \cs{ProcessPackageKeysOption};}
% \changes{0.1.1}{2018/05/23}{\cs{numbrdcsnew} changed to \cs{newnumbrdcs} and made 'disambiguable'}
% \changes{0.1.2}{2018/06/21}{}
% \changes{0.1.2}{2018/06/21}{\cs{erw_compose} reversed order in which the functions are composed, such that it now conforms to
% the mathematical convention ($g\circ f$ means $f$ comes before $g$)}
%\changes{0.1.2}{2018/06/21}{Front end cmds no longer generated with module \pkg{disambig}; Option of the same name deleted;}
%\changes{0.1.2}{2018/06/21}{\pkg{disambig}: pushed the code inside \cs{keys_define};\cs{disambignewcmd} no longer takes a token name as arg, rather a token.}
%\changes{0.1.2}{2018/06/21}{Added \cs{erw_repeat}}
%\changes{0.1.2}{2018/06/21}{Added \cs{erw_split}}
%\changes{0.1.2}{2018/06/21}{Added \cs{erw_last_item}}
%\changes{0.1.2}{2018/06/21}{Added \cs{erw_items_to}}
%\changes{0.1.2}{2018/06/21}{Added \cs{map_thread}}
%\changes{0.1.2}{2018/06/21}{Re-arranged the doc to clearly separate frontend from backend}
%\changes{0.1.3}{2018/06/22}{Wrong versioning, should have been 0.1.2}
%\changes{0.1.4}{2018/06/22}{}
%\changes{0.1.4}{2018/06/22}{Removed \cs{erw_items_to} (redundant with \cs{tl_range:nnn})}
%\changes{0.1.4}{2018/06/22}{Added \cs{erw_accum}}
%\changes{0.1.4}{2018/06/22}{Added \cs{erw_merge}}
%\changes{0.1.4}{2018/06/22}{Added \cs{erw_int_range}}
%\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map}}
%\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map_inline}}
%\changes{0.1.4}{2018/06/22}{Added \cs{erw_is_matrix}}
%\changes{0.1.5}{2019/12/12}{Modified source repository}
%\changes{0.1.5}{2019/12/12}{Rearranged frontend/backend sections}
%\changes{0.1.5}{2019/12/12}{Split Section Preliminaries into Conventions and Requirement.}
%\changes{0.1.5}{2019/12/12}{Removed \pkg{disambig}}
%\changes{0.1.6}{2020/02/05}{Fixed critical bug preventing \pkg{erw-l3} from working without explicit inclusion of \pkg{expl3}}
% 
% % \begin{thebibliography}{1}
%
% ^^A\bibitem{expl3} The \LaTeX3 Project Team {\em The \pkg{expl3} package and \LaTeX3 programming}  
% ^^A\url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/expl3.pdf}
%
% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces} 
% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
%
% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package} 
% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
%
% ^^A \bibitem{l3pckg} The \LaTeX3 Project Team {\em l3packages}  \url{http://mirror.ctan.org/macros/latex/contrib/l3packages/}
%
% ^^A \bibitem{tex.stack:431046} \url{https://tex.stackexchange.com/questions/431046/calling-expl3s-usec-on-an-expression-expanding-to-a-cs-name-causes-error}
%
% ^^A \bibitem{tex.stack:432171} \url{https://tex.stackexchange.com/questions/432171/expl3-making-arguments-from-a-loop}
%
% \end{thebibliography}
%
%
% \iffalse
%</package>
% \fi
% \Finale
\endinput