{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TemplateHaskell #-} module Data.Aviation.WB.Arm.ArmStatic( ArmStatic , HasArmStatic(..) , HasArmStatics(..) , SetArmStatic(..) , HasArmStatic0(..) ) where import Control.Category((.)) import Control.Lens(Lens', Traversal', Setter', makeClassy, iso) import Data.Aviation.Units(Inches(inches), Centimetres(centimetres), Millimetres(millimetres), Thouinches(thouinches)) import Data.Eq(Eq) import Data.Maybe(Maybe) import Data.Monoid(Monoid(mempty, mappend)) import Data.Ord(Ord) import Data.Ratio((%)) import Data.Semigroup(Semigroup((<>))) import Numeric.Lens(dividing, multiplying) import Prelude(Show, Rational, (+)) newtype ArmStatic = ArmStatic Rational deriving (Eq, Ord, Show) makeClassy ''ArmStatic class HasArmStatics a where armStatics :: Traversal' a ArmStatic instance HasArmStatics ArmStatic where armStatics = armStatic class SetArmStatic a where setArmStatic :: Setter' a ArmStatic instance SetArmStatic ArmStatic where setArmStatic = armStatic class HasArmStatic0 a where armStatic0 :: Lens' a (Maybe ArmStatic) instance Inches ArmStatic where inches = iso ArmStatic (\(ArmStatic x) -> x) instance Thouinches ArmStatic where thouinches = multiplying 1000 . inches instance Centimetres ArmStatic where centimetres = dividing (254 % 100) . inches instance Millimetres ArmStatic where millimetres = dividing (254 % 10) . inches instance Semigroup ArmStatic where (<>) = mappend instance Monoid ArmStatic where mempty = ArmStatic 0 ArmStatic w1 `mappend` ArmStatic w2 = ArmStatic (w1 + w2)