@@ -95,11 +95,10 @@ julia> clamp.([11, 8, 5], 10, 6)  # an example where lo > hi
9595 10 
9696``` 
9797""" 
98- clamp (x:: X , lo:: L , hi:: H ) where  {X,L,H} = 
99-     ifelse (x >  hi, convert (promote_type (X,L,H), hi),
100-            ifelse (x <  lo,
101-                   convert (promote_type (X,L,H), lo),
102-                   convert (promote_type (X,L,H), x)))
98+ function  clamp (x:: X , lo:: L , hi:: H ) where  {X,L,H}
99+     T =  promote_type (X, L, H)
100+     return  (x >  hi) ?  convert (T, hi) :  (x <  lo) ?  convert (T, lo) :  convert (T, x)
101+ end 
103102
104103""" 
105104    clamp(x, T)::T 
@@ -120,7 +119,14 @@ julia> trunc(Int, 4pi^2)
12011939 
121120``` 
122121""" 
123- clamp (x, :: Type{T} ) where  {T<: Integer } =  clamp (x, typemin (T), typemax (T)) %  T
122+ function  clamp (x, :: Type{T} ) where  {T<: Integer }
123+     #  delegating to clamp(x, typemin(T), typemax(T)) would promote types
124+     #  this way, we avoid unnecessary conversions
125+     #  think of, e.g., clamp(big(2) ^ 200, Int16)
126+     lo =  typemin (T)
127+     hi =  typemax (T)
128+     return  (x >  hi) ?  hi :  (x <  lo) ?  lo :  convert (T, x)
129+ end 
124130
125131
126132""" 
0 commit comments