module Data.Astro.Utils
(
fromFixed
, trunc
, fraction
, reduceToZeroRange
, toRadians
, fromRadians
, roundToN
, tropicalYearLen
)
where
import Data.Fixed(Fixed(MkFixed), HasResolution(resolution))
fromFixed :: (Fractional a, HasResolution b) => Fixed b -> a
fromFixed fv@(MkFixed v) = (fromIntegral v) / (fromIntegral $ resolution fv)
trunc :: RealFrac a => a -> a
trunc = fromIntegral . truncate
fraction :: (RealFrac a, Num b) => a -> (b, a)
fraction v = let (i, f) = (properFraction v)
in (fromIntegral i, f)
reduceToZeroRange :: RealFrac a => a -> a -> a
reduceToZeroRange r n =
let b = n - (trunc (n / r)) * r
in if b < 0 then b + r else b
toRadians :: Floating a => a -> a
toRadians deg = deg*pi/180
fromRadians :: Floating a => a -> a
fromRadians rad = rad*180/pi
roundToN :: RealFrac a => Int -> a -> a
roundToN n f = (fromInteger $ round $ f * factor) / factor
where factor = 10.0^^n
tropicalYearLen :: Double
tropicalYearLen = 365.242191