@@ -15,9 +15,6 @@ CategoryProduct(c::CategoryProduct) = _CategoryProduct(categories(c))
1515
1616categories (s:: CategoryProduct ) = s. cats
1717
18- const TrivialSector{Categories<: Union{Tuple{},NamedTuple{()}} } = CategoryProduct{Categories}
19- TrivialSector () = CategoryProduct (())
20-
2118# ================================= Sectors interface ====================================
2219SymmetryStyle (T:: Type{<:CategoryProduct} ) = categories_symmetrystyle (categories_type (T))
2320
@@ -99,6 +96,12 @@ function categories_fusion_rule(cats1, cats2)
9996 return shared_cat × diff_cat
10097end
10198
99+ # edge case with empty categories
100+ categories_fusion_rule (cats:: Tuple , :: NamedTuple{()} ) = CategoryProduct (cats)
101+ categories_fusion_rule (:: NamedTuple{()} , cats:: Tuple ) = CategoryProduct (cats)
102+ categories_fusion_rule (cats:: NamedTuple , :: Tuple{} ) = CategoryProduct (cats)
103+ categories_fusion_rule (:: Tuple{} , cats:: NamedTuple ) = CategoryProduct (cats)
104+
102105function recover_style (T:: Type , fused)
103106 style = categories_symmetrystyle (T)
104107 return recover_category_product_type (style, T, fused)
@@ -166,6 +169,14 @@ function ×(g1::AbstractUnitRange, g2::AbstractUnitRange)
166169end
167170
168171# ==================================== Fusion rules ======================================
172+ # cast AbstractCategory to CategoryProduct
173+ function fusion_rule (style:: SymmetryStyle , c1:: CategoryProduct , c2:: AbstractCategory )
174+ return fusion_rule (style, c1, CategoryProduct (c2))
175+ end
176+ function fusion_rule (style:: SymmetryStyle , c1:: AbstractCategory , c2:: CategoryProduct )
177+ return fusion_rule (style, CategoryProduct (c1), c2)
178+ end
179+
169180# generic case: fusion returns a GradedAxes, even for fusion with Empty
170181function fusion_rule (:: NotAbelianStyle , s1:: CategoryProduct , s2:: CategoryProduct )
171182 return to_gradedrange (categories_fusion_rule (categories (s1), categories (s2)))
@@ -176,30 +187,11 @@ function fusion_rule(::AbelianStyle, s1::CategoryProduct, s2::CategoryProduct)
176187 return categories_fusion_rule (categories (s1), categories (s2))
177188end
178189
179- # Empty case
180- function fusion_rule (:: AbelianStyle , :: TrivialSector , :: TrivialSector )
181- return CategoryProduct (())
182- end
183-
184- # TrivialSector acts as trivial on any AbstractCategory, not just CategoryProduct
185- function fusion_rule (:: NotAbelianStyle , :: TrivialSector , c:: AbstractCategory )
186- return to_gradedrange (c)
187- end
188- function fusion_rule (:: NotAbelianStyle , c:: AbstractCategory , :: TrivialSector )
189- return to_gradedrange (c)
190- end
191- function fusion_rule (:: NotAbelianStyle , :: TrivialSector , c:: CategoryProduct )
192- return to_gradedrange (c)
193- end
194- function fusion_rule (:: NotAbelianStyle , c:: CategoryProduct , :: TrivialSector )
195- return to_gradedrange (c)
196- end
197-
198- # abelian case: return Category
199- fusion_rule (:: AbelianStyle , c:: AbstractCategory , :: TrivialSector ) = c
200- fusion_rule (:: AbelianStyle , :: TrivialSector , c:: AbstractCategory ) = c
190+ # lift ambiguities for TrivialSector
201191fusion_rule (:: AbelianStyle , c:: CategoryProduct , :: TrivialSector ) = c
202192fusion_rule (:: AbelianStyle , :: TrivialSector , c:: CategoryProduct ) = c
193+ fusion_rule (:: NotAbelianStyle , c:: CategoryProduct , :: TrivialSector ) = to_gradedrange (c)
194+ fusion_rule (:: NotAbelianStyle , :: TrivialSector , c:: CategoryProduct ) = to_gradedrange (c)
203195
204196# =============================== Ordered implementation =================================
205197CategoryProduct (t:: Tuple ) = _CategoryProduct (t)
0 commit comments