Attempt to convert an 
Integral type 
a to an
Integral type 
b using the size of the types as
measured by 
Bits methods.
A simpler version of this function is:
toIntegral :: (Integral a, Integral b) => a -> Maybe b
toIntegral x
| toInteger x == toInteger y = Just y
| otherwise                  = Nothing
where
y = fromIntegral x
This version requires going through 
Integer, which can be
inefficient. However, 
toIntegralSized is optimized to allow
GHC to statically determine the relative type sizes (as measured by
bitSizeMaybe and 
isSigned) and avoid going through
Integer for many types. (The implementation uses
fromIntegral, which is itself optimized with rules for
base types but may go through 
Integer for some type
pairs.)