aviation-weight-balance-0.0.3: src/Data/Aviation/WB/Arm/ArmRangeUpper.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.Aviation.WB.Arm.ArmRangeUpper(
ArmRangeUpper
, HasArmRangeUpper(..)
, HasArmRangeUppers(..)
, SetArmRangeUpper(..)
, HasArmRangeUpper0(..)
) 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 ArmRangeUpper =
ArmRangeUpper
Rational
deriving (Eq, Ord, Show)
makeClassy ''ArmRangeUpper
class HasArmRangeUppers a where
armRangeUppers ::
Traversal'
a
ArmRangeUpper
instance HasArmRangeUppers ArmRangeUpper where
armRangeUppers =
armRangeUpper
class SetArmRangeUpper a where
setArmRangeUpper ::
Setter'
a
ArmRangeUpper
instance SetArmRangeUpper ArmRangeUpper where
setArmRangeUpper =
armRangeUpper
class HasArmRangeUpper0 a where
armRangeUpper0 ::
Lens'
a
(Maybe ArmRangeUpper)
instance Inches ArmRangeUpper where
inches =
iso
ArmRangeUpper
(\(ArmRangeUpper x) -> x)
instance Thouinches ArmRangeUpper where
thouinches =
multiplying 1000 . inches
instance Centimetres ArmRangeUpper where
centimetres =
dividing (254 % 100) . inches
instance Millimetres ArmRangeUpper where
millimetres =
dividing (254 % 10) . inches
instance Semigroup ArmRangeUpper where
(<>) =
mappend
instance Monoid ArmRangeUpper where
mempty =
ArmRangeUpper 0
ArmRangeUpper w1 `mappend` ArmRangeUpper w2 =
ArmRangeUpper (w1 + w2)