-- | Conversions from 'Data.Ratio.Ratio'.
module Unwitch.Convert.Ratio
  ( unwrapIfDenominatorOne
  , fromIntegralToRatio
  , toFloat
  , toDouble
  )
where

import Data.Ratio(Ratio, (%))
import qualified Data.Ratio as Ratio

-- | Converts if denominator == 1
unwrapIfDenominatorOne :: (Eq a, Num a) => Ratio a -> Maybe a
unwrapIfDenominatorOne :: forall a. (Eq a, Num a) => Ratio a -> Maybe a
unwrapIfDenominatorOne Ratio a
s = if Ratio a -> a
forall a. Ratio a -> a
Ratio.denominator Ratio a
s a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
1 then
  a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ Ratio a -> a
forall a. Ratio a -> a
Ratio.numerator Ratio a
s
  else Maybe a
forall a. Maybe a
Nothing

-- | Wraps an integral value as a Ratio with denominator 1.
fromIntegralToRatio :: (Integral a) => a -> Ratio a
fromIntegralToRatio :: forall a. Integral a => a -> Ratio a
fromIntegralToRatio a
x = a
x a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
% a
1

-- | Converts a Rational to Float. This is lossy for rationals
-- that cannot be exactly represented as Float.
toFloat :: Rational -> Float
toFloat :: Rational -> Float
toFloat = Rational -> Float
forall a. Fractional a => Rational -> a
fromRational

-- | Converts a Rational to Double. This is lossy for rationals
-- that cannot be exactly represented as Double.
toDouble :: Rational -> Double
toDouble :: Rational -> Double
toDouble = Rational -> Double
forall a. Fractional a => Rational -> a
fromRational