\chapter{Cryptol primitive functions}

\commentout{
\begin{code}
primsPlaceHolder=1;
\end{code}
}

\paragraph*{Bitwise operations}
\begin{Verbatim}
    &&, ||, ^ : {a} a -> a -> a
    ~         : {a} a -> a
\end{Verbatim}
\paragraph*{Comparisons}
\begin{Verbatim}
    ==, !=        : {a} (Cmp a) => a -> a -> Bit
    <, >, <=, >=  : {a} (Cmp a) => [a] -> [a] -> Bit
\end{Verbatim}
\paragraph*{Arithmetic}
\begin{Verbatim}
    +, -, *, /, %, ** : {a} (Arith a) => a -> a -> a
    lg2               : {a, b} (Arith a) => a -> a
\end{Verbatim}
%    negate            : {a b} (a >= 1) => [a]b -> [a]b
\paragraph*{Polynomial arithmetic}
\begin{Verbatim}
    pdiv : {a, b} (fin a, fin b) => [a] -> [b] -> [a]
    pmod : {a, b} (fin a, fin b) => [a] -> [1 + b] -> [b]
    pmult : {a, b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]
\end{Verbatim}
\paragraph*{Sequences}
\begin{Verbatim}
    take : {front, back, elem} (fin front) 
        => [front + back]elem -> [front]elem
    drop : {front, back, elem} (fin front) 
        => [front + back]elem -> [front]elem
    tail : {a, b} [a+1]b -> [a]b
    #    : {a, b, c} (fin a) => ([a]b,[c]b) -> [a+c]b
    join : {parts, each, a} (fin each) 
        => [parts][each]a -> [parts * each]a

    groupBy : {each, parts, elem} (fin each) 
           => [parts * each]elem -> [parts][each]elem
    splitBy : {parts, each, elem} 
           => [parts * each]elem -> [parts][each]elem
    reverse : {a, b} (fin a) => [a]b -> [a]b
    @       : {a, b, c} ([a]b,[c]) -> b
    !       : {a, b, c} (fin a) => ([a]b,[c]) -> b
    @@      : {a, b, c, d} ([a]b,[c][d]) -> [c]b
    !!      : {a, b, c, d} (fin a) => ([a]b,[c][d]) -> [c]b
    width   : {a, b, c} (c >= width a) => [a]b -> [c]
\end{Verbatim}
\paragraph*{Shifting, rotating}
\begin{Verbatim}
    >>, <<, >>>, <<< : {a b c} (fin a,c >= lg2 a) 
                     => ([a]b,[c]) -> [a]b
\end{Verbatim}
\paragraph*{Miscellaneous}
\begin{Verbatim}
    zero      : {a} a
    transpose : {a, b, c} [a][b]c -> [b][a]c
    min, max  : {a} (fin a) => ([a],[a]) -> [a]
\end{Verbatim}
%   parity    : {a} (fin a) => [a] -> Bit
\paragraph*{Representing exceptions}
\begin{Verbatim}
    error     : {a, b} [a][8] -> b
    undefined : {a} a
\end{Verbatim}
\todo[inline]{\texttt{error} and \texttt{undefined} are not covered in
  the book at the moment.}

\todo[inline]{What is the state of debugging (\texttt{trace},
  \texttt{ASSERT}), randomness (\texttt{random}), and pretty-printing
  (\texttt{format}) built-ins?}
%\paragraph*{Debugging}
%\begin{Verbatim}
%    trace  : {a b c} ([a][8],b,c) -> c
%    ASSERT : {a b} (Bit,[a][8],b) -> b
%\end{Verbatim}
%\paragraph*{Generating random numbers}
%\begin{Verbatim}
%    random : {a b} (32 >= a) => [a] -> b
%\end{Verbatim}
%\paragraph*{Pretty printing}
%\begin{Verbatim}
%    format
%\end{Verbatim}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../main/Cryptol"
%%% End: 
