%%
%% Package: spectralsequences v1.3.1 2022-01-04
%% Author: Hood Chatham
%% Email: hood@mit.edu
%% Date: 2022-01-04
%% License: Latex Project Public License
%%
%% File: sseqcheckdefinitions.code.tex
%%
%%    A few tikz commands are modified in sseqpages. This file checks the definitions of all commands modified. Of course, this is insufficient to ensure that
%%    the behavior isn't completely wrong, but at least it's a sanity check.
%%

% TODO: we could recover from failing to patch keys.

\sseq@tempiftrue
\begingroup
\def\sseq@checkprotecteddef#1{\def\sseq@temp{\sseq@checkdef@{#1}}\afterassignment\sseq@temp\protected\long\@xp\def\csname sseq@check@\sseq@macroname#1\endcsname}
\def\sseq@checkdef#1{\def\sseq@temp{\sseq@checkdef@{#1}}\afterassignment\sseq@temp\@xp\def\csname sseq@check@\sseq@macroname#1\endcsname}
\def\sseq@checkdef@#1{
    \@xp\ifx\csname sseq@check@\sseq@macroname#1\endcsname#1\else
        \sseq@tempiffalse
    \fi
}

%%
%% sseqmacromakers.code.tex
%%

\ExplSyntaxOn
% I should work out how old the version of xparse has to be before this breaks,
% but I'm too lazy. It would also be nice if I could figure out how to ensure
% that my trick of setting \l__cmd_grab_expandably_bool to false works
% correctly, but this might be difficult
\@ifpackagelater{xparse}{2017/02/08}{
  \cs_if_exist:NTF \__xparse_grab_u:w {
    \global\sseq@patchxparseUtrue
  }{
    \sseq@checkprotecteddef \__cmd_grab_u:w #1#2 \__cmd_run_code:{
        \__cmd_grab_u_aux:nnN {#1} {#2} \cs_set_protected_nopar:Npn
    }

    \sseq@checkprotecteddef\__cmd_grab_u_aux:nnN #1#2#3 {
        \tl_set:Nn \l__cmd_signature_tl {#2}
        \exp_after:wN #3 \l__cmd_fn_tl ##1 #1
          { \__cmd_add_arg:n {##1} }
        \l__cmd_fn_tl
    }


    \sseq@checkprotecteddef \__cmd_normalize_type_u:w #1 {
        \quark_if_recursion_tail_stop_do:nn {#1} { \__cmd_bad_arg_spec:wn }
        \__cmd_normalize_check_lu:N u
        \__cmd_add_arg_spec_mandatory:n { u {#1} } % Oct 17, 2018
%        \int_incr:N \l__cmd_mandatory_args_int
%        \tl_clear:N \l__cmd_last_delimiters_tl
        \__cmd_normalize_arg_spec_loop:n
    }

    \ifsseq@tempif
        \global\sseq@patchxparseUtrue
    \else
        \global\sseq@patchxparseUfalse
    \fi
    \sseq@tempiftrue
  }
}{}

\@ifpackagelater{expl3}{2018/10/01}{
    % TODO: Check that \peek_meaning and \peek_meaning_remove have the right definitions
    \sseq@tempiftrue
    \sseq@checkprotecteddef\peek_meaning_ignore_spaces:NTF#1#2#3{\peek_remove_spaces:n{\peek_meaning:NTF#1{#2}{#3}}}
    \sseq@checkprotecteddef\peek_meaning_remove_ignore_spaces:NTF#1#2#3{\peek_remove_spaces:n{\peek_meaning_remove:NTF#1{#2}{#3}}}
    \ifsseq@tempif\else
        \sseq@error@n{expl3-incompatibility}{\peek_meaning_ignore_spaces:NTF}
    \fi

}{}

\ExplSyntaxOff
\sseq@tempiftrue
%%
%% sseqkeys.code.tex
%%


\sseq@checkdef\pgfkeys@case@one{%
  \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}%
  {\pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}%
   \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov}
  {\pgfkeys@case@two}%
}

\sseq@checkdef\pgfkeys@case@two@extern{%
  \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text%
    \pgfkeysvalueof{\pgfkeyscurrentkey}%
  \else%
    \pgfkeyslet{\pgfkeyscurrentkey}\pgfkeyscurrentvalue%
  \fi%
}


\ifsseq@tempif\else
    \endgroup
    \sseq@tempiffalse % We'll throw a critical error in spectralsequences.sty to end input
    \endinput
\fi
\sseq@tempiftrue
%%
%% sseqdrawing.code.tex
%%

%from \pgf\frontendlayer\tikz\libraries\tikzlibraryfit.code.tex line 81
\sseq@checkdef\tikz@lib@fit@scan@handle#1{%
  \iftikz@shapeborder%
    % Ok, fit all four external anchors, if they exist
    \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{west}}%
    \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{east}}%
    \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{north}}%
    \tikz@lib@fit@adjust{\pgfpointanchor{\tikz@shapeborder@name}{south}}%
  \else%
    \tikz@lib@fit@adjust{#1}%
  \fi%
  \tikz@lib@fit@scan%
}

% from \pgf\frontendlayer\tikz\tikz.code.tex line 5164
\sseq@checkdef\tikz@calc@anchor#1.#2\tikz@stop{%
    \pgfpointanchor{\tikz@pp@name{#1}}{#2}%
}

\ifsseq@tempif
    \global\sseq@patchfittrue
\else
    % New version of \tikz@calc@anchor
    \sseq@tempiftrue
    \sseq@checkdef\tikz@calc@anchor#1.#2\tikz@stop{%
        \ifcsname pgf@sh@ns@\tikz@pp@name {#1}\endcsname
            \pgfpointanchor {\tikz@pp@name {#1}}{#2}%
        \else
            \pgfpointanchor {#1}{#2}%
        \fi
    }
    \ifsseq@tempif
        \global\sseq@patchfittrue
    \else
        \sseq@warning{fit-patch-failed}
        \global\sseq@patchfitfalse
    \fi
\fi

\sseq@tempiftrue


%%
%% sseqforeach.code.tex
%%
\sseq@checkdef\pgffor@@vars@opt[#1]{\pgfkeys{/pgf/foreach/.cd,#1}\pgffor@vars}

\sseq@checkdef\pgffor@doloop{%
  \pgffor@begingroup
    \edef\pgffor@temp{\expandafter\Pgffor@geT\the\pgffor@iter}%
    \edef\pgffor@incheck{{.0/}{\pgffor@temp/}}%
    \expandafter\pgfutil@in@\pgffor@incheck%
    \ifpgfutil@in@%
      \expandafter\pgffor@strip\pgffor@temp%
    \fi%
    \expandafter\pgfutil@in@\expandafter/\expandafter{\pgffor@var}%
    \ifpgfutil@in@%
      \expandafter\def\expandafter\pgffor@valuerest\expandafter{\pgffor@temp//\relax}%
      \expandafter\pgffor@multiassign\pgffor@var/\pgffor@stop/\pgffor@stop/\relax%
    \else%
    	% Convert to alphabetic sequence, if necessary.
    	\ifpgffor@alphabeticsequence%
    		\pgffor@makealphabetic\pgffor@temp%
    		\expandafter\let\pgffor@var=\pgffor@temp%    						
    	\else%
    		\expandafter\expandafter\expandafter\def\expandafter\pgffor@var\expandafter{\pgffor@temp}%
      \fi%
    \fi%
    % Insert any context, if any.
    \ifpgffor@context%
      \let\pgffor@temp=\pgffor@dots@pre%
	    \expandafter\pgfutil@append@macrotomacro\expandafter%
	    	{\expandafter\pgffor@temp\expandafter}\expandafter{\pgffor@var}%
	    \expandafter\pgfutil@append@macrotomacro\expandafter%
	    	{\expandafter\pgffor@temp\expandafter}\expandafter{\pgffor@dots@post}%
	    \expandafter\let\pgffor@var=\pgffor@temp%
	  \fi%
	% Perform assignments before loop body.
	\ifx\pgffor@assign@before@code\pgfutil@empty%
    \else%
    	\pgffor@assign@before@code%
    \fi%
    %
    \expandafter\expandafter\expandafter\pgffor@reset@hooks\expandafter\pgffor@beginhook\expandafter\pgffor@body\pgffor@endhook%
    %
    % Perform assignments after loop body.
	  \ifx\pgffor@assign@after@code\pgfutil@empty%
    \else%
    	\pgffor@assign@after@code%
    \fi%
  \pgffor@endgroup%
  \pgffor@loop%
}

\sseq@checkdef\pgffor@invokebody{%
	\pgffor@begingroup%
    \expandafter\pgfutil@in@\expandafter/\expandafter{\pgffor@var}%
    \ifpgfutil@in@%
      \expandafter\def\expandafter\pgffor@valuerest\expandafter{\pgffor@value//\relax}%
      \expandafter\pgffor@multiassign\pgffor@var/\pgffor@stop/\pgffor@stop/\relax%
    \else%
      \expandafter\expandafter\expandafter\def\expandafter\pgffor@var\expandafter{\pgffor@value}%
    \fi%
    % Execute assign once code.
    \ifx\pgffor@assign@once@code\pgfutil@empty%
  	\else\pgffor@assign@once@code%
  	\fi%
    % Execute assign before code.
    \ifx\pgffor@assign@before@code\pgfutil@empty%
    \else\pgffor@assign@before@code%
    \fi%
    %
    \expandafter\expandafter\expandafter\pgffor@reset@hooks\expandafter\pgffor@beginhook\expandafter\pgffor@body\pgffor@endhook%
    % Execute assign after code.
    \ifx\pgffor@assign@after@code\pgfutil@empty%
    \else%
    	\pgffor@assign@after@code%
    \fi%
    %
  \pgffor@endgroup%
}

\ifsseq@tempif
    \global\sseq@patchforeachtrue
\else
    \sseq@warning{foreach-patch-failed}
    \global\sseq@patchforeachfalse
\fi

\endgroup 