@@ -11,12 +11,13 @@ export Furlong
11
11
struct Furlong{p,T<: Number } <: Number
12
12
val:: T
13
13
Furlong {p,T} (v:: Number ) where {p,T} = new (v)
14
- Furlong {p,T} (x:: Furlong{p} ) where {p,T} = new (x. val)
15
14
end
16
15
Furlong (x:: T ) where {T<: Number } = Furlong {1,T} (x)
16
+ Furlong (x:: Furlong ) = x
17
17
(:: Type{T} )(x:: Furlong ) where {T<: Number } = T (x. val)
18
18
Furlong {p} (v:: Number ) where {p} = Furlong {p,typeof(v)} (v)
19
- Furlong {p,T} (x:: Furlong{p,S} ) where {T,p,S} = Furlong {p,T} (T (x. val))
19
+ Furlong {p} (x:: Furlong{q} ) where {p,q} = (@assert (p== q); Furlong {p,typeof(x.val)} (x. val))
20
+ Furlong {p,T} (x:: Furlong{q} ) where {T,p,q} = (@assert (p== q); Furlong {p,T} (T (x. val)))
20
21
21
22
Base. promote_type (:: Type{Furlong{p,T}} , :: Type{Furlong{p,S}} ) where {p,T,S} =
22
23
(Base. @_pure_meta ; Furlong{p,promote_type (T,S)})
@@ -70,6 +71,8 @@ for (op,eop) in ((:*, :_plus), (:/, :_minus), (://, :_minus), (:div, :_minus))
70
71
$ op (x:: S , y:: Furlong{p} ) where {p,S<: Number } = $ op (Furlong {0,S} (x),y)
71
72
end
72
73
end
74
+ # to fix an ambiguity
75
+ // (x:: Furlong , y:: Complex ) = x // Furlong {0,typeof(y)} (y)
73
76
for op in (:rem , :mod )
74
77
@eval begin
75
78
$ op (x:: Furlong{p} , y:: Furlong ) where {p} = Furlong {p} ($ op (x. val, y. val))
0 commit comments