packages feed

orbits-0.3: test/WrappedAngle.hs

module WrappedAngle
  ( WrappedAngle(..)
  ) where

import           Data.Constants.Mechanics.Extra
import           Data.Metrology
import           Data.Metrology.Extra
import           Data.Metrology.QuickCheck      ( )
import           Data.Metrology.Show            ( )
import           Data.Units.SI.Parser
import           Test.QuickCheck.Checkers       ( EqProp(..)
                                                , eq
                                                )
import           Test.Tasty.QuickCheck          ( Arbitrary )

-- A wrapper which compares angles for equality modulo 2π
newtype WrappedAngle a = WrappedAngle (MkQu_ULN [si|rad|] 'DefaultLCSU a)
  deriving (Show, Arbitrary)

instance (Floating a, Real a) => Eq (WrappedAngle a) where
  WrappedAngle x == WrappedAngle y = (x `mod'` turn) == (y `mod'` turn)

instance (Floating a, Real a) => EqProp (WrappedAngle a) where
  (=-=) = eq