module Gamgine.Math.Utils where

clamp :: Double -> Double -> Double -> Double
clamp min max value
   | value < min = min
   | value > max = max
   | otherwise = value

flipSign :: Double -> Double
flipSign num = -1 * signum num

maxFloat :: RealFloat a => a -> a
maxFloat a = encodeFloat m n
   where
      b = floatRadix a
      e = floatDigits a
      (_, e') = floatRange a
      m = b ^ e - 1
      n = e' - e

instance Bounded Double where
   maxBound = maxFloat (0 :: Double)
   minBound = -maxBound

minPositiveFloat :: RealFloat a => a -> a
minPositiveFloat a = encodeFloat 1 $ fst (floatRange a) - floatDigits a

minPositiveDouble = minPositiveFloat (0 :: Double)