1- Base. promote_rule (:: Type{PT} , :: Type{PS} ) where {PT<: APL , PS<: APL } = promote_type (polynomialtype (PT), polynomialtype (PS))
2- Base. promote_rule (:: Type{PT} , :: Type{PT} ) where {PT<: APL } = PT
1+ # MonomialLike
2+ Base. promote_rule (:: Type{M} , :: Type{M} ) where {M<: AbstractMonomialLike } = M
3+ function Base. promote_rule (M1:: Type{<:AbstractMonomialLike} ,
4+ M2:: Type{<:AbstractMonomialLike} )
5+ return promote_type (monomialtype (M1), monomialtype (M2))
6+ end
37
4- promote_rule_constant (:: Type{T} , :: Type{RationalPoly{NT, DT}} ) where {T, NT, DT} = RationalPoly{promote_type (T, NT), promote_type (DT, termtype (DT))}
8+ # TermLike
9+ Base. promote_rule (:: Type{T} , :: Type{T} ) where {T<: AbstractTermLike } = T
10+ function Base. promote_rule (TS:: Type{<:AbstractTermLike{S}} , TT:: Type{<:AbstractTermLike{T}} ) where {S, T}
11+ U = promote_type (S, T)
12+ M = promote_type (monomialtype (TS), monomialtype (TT))
13+ return termtype (M, U)
14+ end
15+ function promote_rule_constant (:: Type{S} , TT:: Type{<:AbstractTermLike{T}} ) where {S, T}
16+ return termtype (TT, promote_type (S, T))
17+ end
18+
19+
20+ # PolynomialLike
21+ Base. promote_rule (:: Type{PT} , :: Type{PT} ) where {PT<: APL } = PT
22+ function Base. promote_rule (PS:: Type{<:APL} , PT:: Type{<:APL} )
23+ return polynomialtype (promote_type (termtype (PS), termtype (PT)))
24+ end
525
26+ function promote_rule_constant (:: Type{S} , PT:: Type{<:APL{T}} ) where {S, T}
27+ return polynomialtype (PT, promote_type (S, T))
28+ end
629Base. promote_rule (:: Type{PT} , :: Type{T} ) where {T, PT<: APL } = promote_rule_constant (T, PT)
730Base. promote_rule (:: Type{T} , :: Type{PT} ) where {T, PT<: APL } = promote_rule_constant (T, PT)
31+
32+ # Rational
33+ promote_rule_constant (:: Type{T} , :: Type{RationalPoly{NT, DT}} ) where {T, NT, DT} = RationalPoly{promote_type (T, NT), promote_type (DT, termtype (DT))}
34+
835Base. promote_rule (:: Type{T} , :: Type{RT} ) where {T, RT<: RationalPoly } = promote_rule_constant (T, RT)
936Base. promote_rule (:: Type{RT} , :: Type{T} ) where {T, RT<: RationalPoly } = promote_rule_constant (T, RT)
1037
@@ -15,21 +42,7 @@ Base.promote_rule(::Type{RS}, ::Type{RT}) where {RS<:RationalPoly, RT<:RationalP
1542Base. promote_rule (:: Type{PT} , :: Type{RT} ) where {PT<: APL , RT<: RationalPoly } = promote_rule_rational (PT, RT)
1643Base. promote_rule (:: Type{RT} , :: Type{PT} ) where {PT<: APL , RT<: RationalPoly } = promote_rule_rational (PT, RT)
1744
18- # Promotion with Term
19- function Base. promote_rule (ST:: Type{<:AbstractTermLike{S}} , TT:: Type{<:AbstractTerm{T}} ) where {S, T}
20- U = promote_type (S, T)
21- UT = termtype (ST, U)
22- if UT != termtype (TT, U)
23- error (" Cannot promote `$ST ` and `$TT ` to the same type." )
24- end
25- return UT
26- end
27-
28- # promote_rule(::Type{Term{C, U}}, ::Type{RationalPoly{C, S, T}}) where {C, S, T, U} = RationalPoly{C, promote_type(U, S), T}
29- # promote_rule(::Type{RationalPoly{C, S, T}}, ::Type{Term{C, U}}) where {C, S, T, U} = RationalPoly{C, promote_type(U, S), T}
30- # promote_rule(::Type{Polynomial{C, U}}, ::Type{RationalPoly{C, S, T}}) where {C, S, T, U} = RationalPoly{C, promote_type(U, S), T}
31- # promote_rule(::Type{RationalPoly{C, S, T}}, ::Type{Polynomial{C, U}}) where {C, S, T, U} = RationalPoly{C, promote_type(U, S), T}
32-
45+ # MutableArithmetics
3346function MA. promote_operation (
3447 op:: Union{typeof(+), typeof(-)} , PT:: Type{<:APL{S}} ,
3548 QT:: Type{<:APL{T}} ) where {S, T}
0 commit comments