\input ptb-utils

\_checkloaded{counters}

\input ptb-arrays

%   Makes counter #1 dependent on #2
\def\adddependentcounter#1#2{%
    \def\_regA{#1}\def\_regB{#2}%
    \ifx\_regA\_regB%
        \errhelp={Making a counter dependent on itself will result in an infinite loop whenever it is altered}%
        \errmessage{A counter cannot be dependent on itself}%
    \fi%
    \appendarray{count@#2@dependents}{#1}%
}

\def\_createcounter#1[#2]{%
    \commap{\adddependentcounter{#1}}{#2}%
}

\def\createcounter#1{%
    \_xp\newcount\csname count@#1\endcsname%
    \currset\csname count@#1\endcsname=0\relax%
    \createarray{count@#1@dependents}%
    \_ifnextchar[ {\_createcounter{#1}}{}%
}

\def\_zerocounter#1#2{%
    \currset\csname count@#1\endcsname=\z@%
    \zerodependents{#1}%
}

\def\zerodependents#1{%
    \arraymap{count@#1@dependents}\_zerocounter%
}

\def\setcounter#1#2{%
    \currset\csname count@#1\endcsname=#2\relax%
    \zerodependents{#1}%
}

\def\advancecounter#1#2{%
    \currset\advance\csname count@#1\endcsname by #2\relax%
    \zerodependents{#1}%
}

\def\advanceicounter#1#2{%
    \currset\advance\count\csname count@#1\endcsname by #2\relax%
}

\def\seticounter#1#2{%
    \currset\count\csname count@#1\endcsname=#2\relax%
}

\def\counter#1{%
    \csname count@#1\endcsname%
}