content: {-|
  Module      : Monomer.Core.FromFractional
  Copyright   : (c) 2018 Francisco Vallarino
  License     : BSD-3-Clause (see the LICENSE file)
  Maintainer  : fjvallarino@gmail.com
  Stability   : experimental
  Portability : non-portable
  
  Conversions from Fractional to several types. Used by dial, numericField,
  slider and other numeric related widgets.
  -}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  
  module Monomer.Core.FromFractional (
    FromFractional(..)
  ) where
  
  import Data.Int
  import Data.Fixed
  import Data.Word
  import Foreign.C.Types
  
  fractionalToIntegral :: (Integral a, Real b, Fractional b) => b -> a
  fractionalToIntegral num = round newNum where
    newNum :: Rational
    newNum = realToFrac num
  
  -- | Converts a Fractional number to the target type.
  class Real a => FromFractional a where
    fromFractional :: (Real b, Fractional b) => b -> a
  
  instance FromFractional Integer where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Int where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Int8 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Int16 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Int32 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Int64 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Word where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Word8 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Word16 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Word32 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Word64 where
    fromFractional = fractionalToIntegral
  
  instance FromFractional Float where
    fromFractional = realToFrac
  
  instance FromFractional Double where
    fromFractional = realToFrac
  
  instance FromFractional CFloat where
    fromFractional = realToFrac
  
  instance FromFractional CDouble where
    fromFractional = realToFrac
  
  instance FromFractional Rational where
    fromFractional = realToFrac
  
  instance HasResolution a => FromFractional (Fixed a) where
    fromFractional = realToFrac
  