packages feed

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)