module Numeric.Geocalc (getDistance) where

-- |getDistance takes two Coordinates in WSG84 and checks if they are valid.
-- If they are it calculets the distance between them in kilometres
getDistance :: (Double, Double) -> (Double, Double) -> Maybe Double
getDistance (lat1, lon1) (lat2, lon2)
  | lat1>90.0 || lat1< -90.0 || lon1>180.0 || lon1< -180.0 = Nothing
  | lat2>90.0 || lat2< -90.0 || lon2>180.0 || lon2< -180.0 = Nothing
  | otherwise = Just $
                6378.388 * arccosinus (
                  sinus(lat1) * sinus(lat2) + 
                  cosinus(lat1) * cosinus(lat2) * cosinus(lon2-lon1)
                  )

sinus :: Double -> Double
sinus = sin . toRadian

cosinus :: Double -> Double
cosinus = cos . toRadian

arccosinus :: Double -> Double
arccosinus = acos

toRadian :: Double -> Double
toRadian deg = pi/180.0 * deg

toDegree :: Double -> Double
toDegree rad = 180/pi * rad