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
3
7
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
5
25
26
+ function promote_rule_constant (:: Type{S} , PT:: Type{<:APL{T}} ) where {S, T}
27
+ return polynomialtype (PT, promote_type (S, T))
28
+ end
6
29
Base. promote_rule (:: Type{PT} , :: Type{T} ) where {T, PT<: APL } = promote_rule_constant (T, PT)
7
30
Base. 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
+
8
35
Base. promote_rule (:: Type{T} , :: Type{RT} ) where {T, RT<: RationalPoly } = promote_rule_constant (T, RT)
9
36
Base. promote_rule (:: Type{RT} , :: Type{T} ) where {T, RT<: RationalPoly } = promote_rule_constant (T, RT)
10
37
@@ -15,21 +42,7 @@ Base.promote_rule(::Type{RS}, ::Type{RT}) where {RS<:RationalPoly, RT<:RationalP
15
42
Base. promote_rule (:: Type{PT} , :: Type{RT} ) where {PT<: APL , RT<: RationalPoly } = promote_rule_rational (PT, RT)
16
43
Base. promote_rule (:: Type{RT} , :: Type{PT} ) where {PT<: APL , RT<: RationalPoly } = promote_rule_rational (PT, RT)
17
44
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
33
46
function MA. promote_operation (
34
47
op:: Union{typeof(+), typeof(-)} , PT:: Type{<:APL{S}} ,
35
48
QT:: Type{<:APL{T}} ) where {S, T}
0 commit comments