module GreatCircleBG
    ( benchmark
    ) where

import Criterion.Types
import Data.Geo.Jord.Angle (Angle)
import qualified Data.Geo.Jord.Angle as Angle (decimalDegrees)
import Data.Geo.Jord.Geodetic (HorizontalPosition)
import qualified Data.Geo.Jord.Geodetic as Geodetic
import qualified Data.Geo.Jord.GreatCircle as GreatCircle
import Data.Geo.Jord.Length (Length)
import qualified Data.Geo.Jord.Length as Length (kilometres)
import Data.Geo.Jord.Models (S84(..))

benchmark :: Benchmark
benchmark =
    bgroup
        "Great Circle"
        [ bench "alongTrackDistance" $ whnf (GreatCircle.alongTrackDistance' p1 p2) a
        , bench "angularDistance" $ whnf (GreatCircle.angularDistance p1 p2) (Just p3)
        , bench "crossTrackDistance" $ whnf (GreatCircle.crossTrackDistance' p1 p2) a
        , bench "destination" $ whnf (GreatCircle.destination p1 a) l
        , bench "interpolated" $ whnf (GreatCircle.interpolated p1 p2) 0.5
        , bench "distance" $ whnf (GreatCircle.distance p1) p2
        , bench "finalBearing" $ whnf (GreatCircle.finalBearing p1) p2
        , bench "initialBearing" $ whnf (GreatCircle.initialBearing p1) p2
        ]

p1 :: HorizontalPosition S84
p1 = Geodetic.nvectorPos 0.5504083453140064 0.12711022980808237 0.8251627978083076 S84

p2 :: HorizontalPosition S84
p2 = Geodetic.nvectorPos 0.484947835927087 0.1582112780286092 0.860113241343365 S84

p3 :: HorizontalPosition S84
p3 = Geodetic.nvectorPos 0.5225962210695282 0.11083913756305296 0.8453448262739457 S84

a :: Angle
a = Angle.decimalDegrees 45.0

l :: Length
l = Length.kilometres 5000