module Degree where import qualified Arithmetic as Arith import qualified Data.Csv as Csv import Data.Monoid (Monoid, mempty, mappend) newtype Degree a = Degree {getDegree :: a} deriving (Eq, Show) instance (Num a) => Monoid (Degree a) where mempty = Degree 0 mappend (Degree x) (Degree y) = Degree $ x+y instance Functor Degree where fmap f (Degree x) = Degree $ f x instance Csv.FromField a => Csv.FromField (Degree a) where parseField s = fmap Degree $ Csv.parseField s toRadian :: (Floating a) => Degree a -> a toRadian (Degree angle) = angle*pi/180 fromRadian :: (Floating a) => a -> Degree a fromRadian angle = Degree $ angle*180/pi linearScale :: (Fractional a) => Int -> Degree a -> [Degree a] linearScale num (Degree maxAngle) = map Degree $ Arith.linearScale num (-maxAngle, maxAngle) cis :: (Floating a) => Degree a -> (a,a) cis deg = case toRadian deg of rad -> (cos rad, sin rad)