\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{functional}
  [2020/09/10 1.0.0 Usefull definitions for Category Theory]

\RequirePackage{amssymb}
\RequirePackage{amsmath}   % For the \DeclareMathOperator
\RequirePackage{extarrows} % For \xlongrightarrow
\RequirePackage{xfrac}     % For \sfrac
\RequirePackage{relsize}   % For \mathlarger

% Define symbols for categories
\newcommand{\categoryname}[1]{\ensuremath{\mathbf{#1}}}
\newcommand{\newcategory}[2]{\newcommand{#1}{\categoryname{#2}}}
\newcommand{\renewcategory}[2]{\renewcommand{#1}{\categoryname{#2}}}

% Generic stuff
\DeclareMathOperator{\Obj}{Obj}     % The class of objects of a category
\DeclareMathOperator{\Hom}{Hom}     % The class of morphisms of a category
\DeclareMathOperator{\End}{End}     % Endomorphisms
\DeclareMathOperator{\Aut}{Aut}     % Automorphisms
\DeclareMathOperator{\coker}{coker} % Cokernel
\newcommand{\normal}{\triangleleft} % A normal subobject in a pointed cathegory
\newcommand{\op}{\mathrm{op}}       % Dual category
\newcommand{\isoto}
  {\xlongrightarrow{\sim}}          % Isomorphism arrow
\newcommand{\mfrac}[2]
  {\mathlarger{\sfrac{#1}{#2}}}     % Quotient object
\newcommand{\wfrac}[2]
  {\mathlarger{_{#2}\mkern-.5mu\backslash\mkern-2mu^{#1}}} % Quotient object

% Function stuff
\DeclareMathOperator{\dom}{dom}     % The domain of a morphism
\DeclareMathOperator{\codom}{codom} % The codomain of a morphism
\DeclareMathOperator{\im}{im}       % The image of morphism
\DeclareMathOperator{\id}{id}       % Identity function
\newcommand{\To}{\Rightarrow}       % Natural transformation
\newcommand{\ot}{\leftarrow}        % Reversed morphism
\newcommand{\Ot}{\Leftarrow}        % Reversed natural transformation
\newcommand{\fmapsto}[1]
  {\overset{#1}{\longmapsto}}       % Map declaration

% Notable categories
\newcategory{\Set}{Set}       % The category of sets
\newcategory{\Grp}{Grp}       % The category of groups
\newcategory{\FinGrp}{FinGrp} % The category of finite abelian groups
\newcategory{\Ab}{Ab}         % The category of abelian groups
\newcategory{\FinAb}{FinAb}   % The category of finite abelian groups
\newcategory{\Ring}{Ring}     % The category of rings
\newcategory{\CRing}{CRing}   % The category of commutative rings
\newcategory{\Meas}{Meas}     % The category of measurable spaces
\newcategory{\Top}{Top}       % The category of topological spaces
\newcategory{\Haus}{Haus}     % The category of Hausdorf spaces
\newcategory{\KHaus}{KHaus}   % The category of compact Hausdorf spaces
\newcategory{\LCHaus}{LCHaus} % The category of locally compact Hausdorf spaces
\newcategory{\GrpTop}{GrpTop} % The category of topological groups
\newcategory{\LCGpr}{LCGpr}   % The category of locally compact groups
\newcategory{\LCAb}{LCAb}     % The category of locally compact abelian groups
\newcategory{\CAb}{CAb}       % The category of compact abelian groups
\newcategory{\Mfd}{Mfd}       % The category of smooth manifilds
\newcategory{\LieGrp}{LieGrp} % The category of Lie groups
\newcategory{\LieAlg}{LieAlg} % The category of Lie algebras
\newcategory{\Graph}{Graph}   % The category of graphs
\newcategory{\Quiv}{Quiv}     % The category of quivers
\newcategory{\PSh}{PSh}       % The category of presheafs over some category
\newcategory{\Sh}{Sh}         % The category of sheafs over some site
\newcategory{\Bun}{Bun}       % The category of principal G-bundles over some
                              % manifold
\newcategory{\Rep}{Rep}       % The category of representations of an object
\newcategory{\rep}{rep}       % The category of finite-dimensional 
                              % representations of an object
\newcategory{\Cat}{Cat}       % The category of (small) categories
% The category of vector spaces over a (parameterized) field
\newcommand{\Vect}[1]
  {\ensuremath{#1\operatorname{-}\!\categoryname{Vect}}}
% The category of modules over a (parameterized) ring
\newcommand{\Mod}[1]
  {\ensuremath{#1\operatorname{-}\!\categoryname{Mod}}}
% The category of algebras over a (parameterized) field
\newcommand{\Alg}[1]
  {\ensuremath{#1\operatorname{-}\!\categoryname{Alg}}}

\endinput
