##############################################################################
##
#W  map2dnd.gd                 GAP4 package `XMod'               Chris Wensley
##                                                                Alper Odabas
#Y  Copyright (C) 2001-2017, Chris Wensley et al, 
#Y  School of Computer Science, Bangor University, U.K. 

############################################################################## 
## 
#C  IsGeneral2DimensionalMapping( <map> )
#C  IsNonSPGeneral2DimensionalMapping( <map> )
#C  IsSPGeneral2DimensionalMapping( <map> )
## 
#T  do we need the SP and nonSP division ?
##  Crossed module and cat1-group mapping declarations 

DeclareCategory( "IsGeneral2DimensionalMapping", IsGeneralMapping ); 
DeclareCategory( "IsSPGeneral2DimensionalMapping", 
    IsSPGeneralMapping and IsGeneral2DimensionalMapping ); 
DeclareCategory( "IsNonSPGeneral2DimensionalMapping", 
    IsNonSPGeneralMapping and IsGeneral2DimensionalMapping ); 

##  temporary measure to keep XModAlg working:
DeclareSynonym( "IsGeneral2dMapping", IsGeneral2DimensionalMapping ); 

#############################################################################
##
#C  IsGeneral2DimensionalMappingCollection . . category of colls of mwo maps
#C  IsGeneral2DimensionalMappingCollColl . . . category of colls of colls 
#C  IsGeneral2DimensionalMappingCollCollColl . category of colls, colls, colls
##
DeclareCategoryCollections( "IsGeneral2DimensionalMapping" );
DeclareCategoryCollections( "IsGeneral2DimensionalMappingCollection" );
DeclareCategoryCollections( "IsGeneral2DimensionalMappingCollColl" );

#############################################################################
##
#P  Is2DimensionalMapping( <map> )
#P  IsEndoGeneral2DimensionalMapping( <map> )
#P  IsEndo2DimensionalMapping( <map> )
#P  Is2DimensionalMagmaGeneralMapping( <map> ) 
#P  Is2DimensionalMagmaMorphism( <map> ) 
#P  Is2DimensionalSemigroupMorphism( <map> )
#P  Is2DimensionalMonoidMorphism( <map> )
DeclareSynonymAttr( "Is2DimensionalMapping", 
    IsGeneral2DimensionalMapping and IsMapping );
DeclareSynonymAttr( "IsEndoGeneral2DimensionalMapping",
    IsGeneral2DimensionalMapping and IsEndoGeneralMapping );
DeclareSynonymAttr( "IsEndo2DimensionalMapping", 
    Is2DimensionalMapping and IsEndoMapping );
DeclareSynonymAttr( "Is2DimensionalMagmaGeneralMapping", 
    IsGeneral2DimensionalMapping and RespectsMultiplication );
DeclareSynonymAttr( "Is2DimensionalMagmaMorphism", 
    Is2DimensionalMagmaGeneralMapping and IsMapping );

#?  modify these next three to SynonymAttr's ??
DeclareProperty( "Is2DimensionalSemigroupMorphism", 
    Is2DimensionalMagmaMorphism  );
DeclareProperty( "Is2DimensionalMonoidMorphism", 
    Is2DimensionalMagmaMorphism );

############################################################################# 
##  
#V  General2DimensionalMappingFamily . family for homs of magmas with objects 
#R  Is2DimensionalMappingRep( <map> )
##  
BindGlobal( "General2DimensionalMappingFamily", 
    NewFamily( "General2DimensionalMappingFamily", IsGeneral2DimensionalMapping, 
               CanEasilySortElements, CanEasilySortElements ) ); 
DeclareRepresentation( "Is2DimensionalMappingRep", 
    Is2DimensionalMagmaMorphism and IsAttributeStoringRep and IsGeneralMapping, 
    [ "Source", "Range", "SourceHom", "RangeHom" ] );

############################################################################## 
## 
#C  Is2DimensionalGroupMorphism( <map> )
#C  Is2DimensionalGroupMorphismCollection . category of colls of pre-xmod homs
#C  Is2DimensionalGroupMorphismCollColl . . . . . . category of colls of colls 
#C  Is2DimensionalGroupMorphismCollCollColl .  category of colls, colls, colls
#V  Family2DimensionalGroupMorphism . .  family for homomorphisms of pre-xmods 
#T  Type2DimensionalGroupMorphism . . . .  type for homomorphisms of pre-xmods 
##
DeclareCategory( "Is2DimensionalGroupMorphism", IsGeneral2DimensionalMapping ); 
DeclareCategoryCollections( "Is2DimensionalGroupMorphism" );
DeclareCategoryCollections( "Is2DimensionalGroupMorphismCollection" );
DeclareCategoryCollections( "Is2DimensionalGroupMorphismCollColl" );
BindGlobal( "Family2DimensionalGroupMorphism", 
    NewFamily( "Family2DimensionalGroupMorphism", Is2DimensionalGroupMorphism, 
               CanEasilySortElements, CanEasilySortElements ) ); 
BindGlobal( "Type2DimensionalGroupMorphism", 
            NewType( Family2DimensionalGroupMorphism, 
                     Is2DimensionalMappingRep ) ); 

#############################################################################
##
#P  IsPreXModMorphism( <map> ) 
#P  IsPreCat1Morphism( <map> ) 
#P  IsXModMorphism( <map> ) 
#P  IsCat1Morphism( <map> ) 
##  
DeclareProperty( "IsPreXModMorphism", Is2DimensionalGroupMorphism );
DeclareProperty( "IsPreCat1Morphism", Is2DimensionalGroupMorphism );
DeclareProperty( "IsXModMorphism", IsPreXModMorphism );
DeclareProperty( "IsCat1Morphism", IsPreCat1Morphism );

############################################################################## 
## 
#A  SourceHom( <mor> )
#A  RangeHom( <mor> )
## 
DeclareAttribute( "SourceHom", Is2DimensionalGroupMorphism );
DeclareAttribute( "RangeHom", Is2DimensionalGroupMorphism );

############################################################################# 
##  
##  Make2DimensionalMagmaMorphism( <args> )
## 
DeclareGlobalFunction( "Make2DimensionalMagmaMorphism" ); 

#############################################################################
##
#A  Kernel2DimensionalMapping( <mor> )
##
DeclareAttribute( "Kernel2DimensionalMapping", Is2DimensionalGroupMorphism );

##  temporary measure to keep XModAlg working:
DeclareSynonymAttr( "Kernel2dMapping", Kernel2DimensionalMapping ); 

########################  HIGHER DIMENSIONAL MAPPINGS  ###################### 

#############################################################################
##
#C  IsGeneralHigherDimensionalMapping( <map> )
#C  IsNonSPGeneralHigherDimensionalMapping( <map> )
#C  IsSPGeneralHigherDimensionalMapping( <map> )
##  
DeclareCategory( "IsGeneralHigherDimensionalMapping", 
    IsGeneral2DimensionalMapping );
DeclareCategory( "IsSPGeneralHigherDimensionalMapping", 
    IsGeneralHigherDimensionalMapping and IsSPGeneralMapping );
DeclareCategory( "IsNonSPGeneralHigherDimensionalMapping", 
    IsGeneralHigherDimensionalMapping and IsNonSPGeneralMapping );

#############################################################################
##
#C  IsGeneralHigherDimensionalMapping 
##               . . . . . category of colls of higher dimensional magma maps
#C  IsGeneralHigherDimensionalMappingCollColl . .  category of colls of colls 
##
DeclareCategoryCollections( "IsGeneralHigherDimensionalMapping" );
DeclareCategoryCollections( "IsGeneralHigherDimensionalMappingCollection" );
DeclareCategoryCollections( "IsGeneralHigherDimensionalMappingCollColl" );

#############################################################################
##
#P  IsHigherDimensionalMapping( <map> )
#P  IsEndoGeneralHigherDimensionalMapping( <map> )
#P  IsEndoHigherDimensionalMapping( <map> )
#P  IsHigherDimensionalMagmaGeneralMapping( <map> ) 
#P  IsHigherDimensionalMagmaMorphism( <map> ) 
#P  IsHigherDimensionalSemigroupMorphism( <map> )
#P  IsHigherDimensionalMonoidMorphism( <map> )
DeclareSynonymAttr( "IsHigherDimensionalMapping", 
    IsGeneralHigherDimensionalMapping and IsMapping );
DeclareSynonymAttr( "IsEndoGeneralHigherDimensionalMapping",
    IsGeneralHigherDimensionalMapping and IsEndoGeneralMapping );
DeclareSynonymAttr( "IsEndoHigherDimensionalMapping", 
    IsHigherDimensionalMapping and IsEndoMapping );
DeclareSynonymAttr( "IsHigherDimensionalMagmaGeneralMapping", 
    IsGeneralHigherDimensionalMapping and RespectsMultiplication );
DeclareSynonymAttr( "IsHigherDimensionalMagmaMorphism", 
    IsHigherDimensionalMagmaGeneralMapping and IsMapping );
DeclareProperty( "IsHigherDimensionalSemigroupMorphism", 
    IsHigherDimensionalMagmaMorphism  );
DeclareProperty( "IsHigherDimensionalMonoidMorphism", 
    IsHigherDimensionalMagmaMorphism );

############################################################################# 
##  
#V  GeneralHigherDimensionalMappingFamily 
##          . . . . family for homs of higher dimensional magmas with objects 
#R  IsHigherDimensionalMappingRep( <mor> )
##  
BindGlobal( "GeneralHigherDimensionalMappingFamily", 
    NewFamily( "GeneralHigherDimensionalMappingFamily", IsGeneralHigherDimensionalMapping, 
               CanEasilySortElements, CanEasilySortElements ) ); 
DeclareRepresentation( "IsHigherDimensionalMappingRep", 
    IsHigherDimensionalMapping and IsAttributeStoringRep,
    [ "Source", "Range", "ListOfHomomorphisms", "HigherDimension" ] );

############################################################################## 
## 
#C  IsHigherDimensionalGroupMorphism( <map> )
#C  IsHigherDimensionalGroupMorphismCollection 
#C  IsHigherDimensionalGroupMorphismCollColl . 
#V  FamilyHigherDimensionalGroupMorphism  
#T  Type2DimensionalGroupMorphism 
##
DeclareCategory( "IsHigherDimensionalGroupMorphism", 
    IsGeneralHigherDimensionalMapping ); 
DeclareCategoryCollections( "IsHigherDimensionalGroupMorphism" );
DeclareCategoryCollections( "IsHigherDimensionalGroupMorphismCollection" );
DeclareCategoryCollections( "IsHigherDimensionalGroupMorphismCollColl" );
BindGlobal( "FamilyHigherDimensionalGroupMorphism", 
    NewFamily( "FamilyHigherDimensionalGroupMorphism", 
               IsHigherDimensionalGroupMorphism, 
               CanEasilySortElements, CanEasilySortElements ) ); 
BindGlobal( "TypeHigherDimensionalGroupMorphism", 
            NewType( FamilyHigherDimensionalGroupMorphism, 
                     IsHigherDimensionalMappingRep ) ); 

#############################################################################
##
#C  IsGeneral3DimensionalMapping( <map> )
#C  IsNonSPGeneral3DimensionalMapping( <map> )
#C  IsSPGeneral3DimensionalMapping( <map> )
##  
DeclareCategory( "IsGeneral3DimensionalMapping", IsGeneral2DimensionalMapping );
DeclareCategory( "IsSPGeneral3DimensionalMapping", 
    IsGeneral3DimensionalMapping and IsSPGeneralMapping );
DeclareCategory( "IsNonSPGeneral3DimensionalMapping", 
    IsGeneral3DimensionalMapping and IsNonSPGeneralMapping );

#############################################################################
##
#P  IsPreSqMorphism( <map> ) 
#P  IsPreCat2Morphism( <map> ) 
#P  IsCrossedSquareMorphism( <map> ) 
#P  IsCat2Morphism( <map> ) 
##  
DeclareProperty( "IsPreCrossedSquareMorphism", 
    IsHigherDimensionalGroupMorphism );
DeclareProperty( "IsPreCat2Morphism", IsHigherDimensionalGroupMorphism );
DeclareProperty( "IsCrossedSquareMorphism", IsHigherDimensionalGroupMorphism );
DeclareProperty( "IsCat2Morphism", IsHigherDimensionalGroupMorphism );

#############################################################################
##
#A  Up2DimensionalMorphism( <mor> )
#A  Left2DimensionalMorphism( <mor> )
#A  Down2DimensionalMorphism( <mor> )
#A  Right2DimensionalMorphism( <mor> )
#O  Make3DimensionalMapping( <src>, <rng>, <srchom>, <rnghom> )
##
##  A pre-crossed square or pre-cat2-group morphism contains 4 group homs
##
DeclareAttribute( "Up2DimensionalMorphism", IsHigherDimensionalMapping );
DeclareAttribute( "Left2DimensionalMorphism", IsHigherDimensionalMapping );
DeclareAttribute( "Down2DimensionalMorphism", IsHigherDimensionalMapping );
DeclareAttribute( "Right2DimensionalMorphism", IsHigherDimensionalMapping );


############################################################################## 
## 
#E  map2dnd.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here 
## 
