{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}

module Data.Aviation.C172.WB.C172Arms(
  C172Arms(..)
, HasC172Arms(..)
, c172ArmsPOH
) where

import Control.Applicative(Applicative((<*>), pure))
import Control.Lens(makeClassy, (^.))
import Data.Aviation.Units(inches)
import Data.Aviation.WB.Arm(Arm, (.->.), rangeArm, staticArm)
import Data.Eq(Eq)
import Data.Foldable(Foldable(foldr))
import Data.Functor(Functor(fmap), (<$>))
import Data.Ord(Ord)
import Data.Traversable(Traversable(traverse))
import Prelude(Show)

data C172Arms a =
  C172Arms {
    C172Arms a -> a
_frontseat ::
      a
  , C172Arms a -> a
_rearseat ::
      a
  , C172Arms a -> a
_fuel ::
      a
  , C172Arms a -> a
_baggagea ::
      a
  , C172Arms a -> a
_baggageb ::
      a
  }
  deriving (C172Arms a -> C172Arms a -> Bool
(C172Arms a -> C172Arms a -> Bool)
-> (C172Arms a -> C172Arms a -> Bool) -> Eq (C172Arms a)
forall a. Eq a => C172Arms a -> C172Arms a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: C172Arms a -> C172Arms a -> Bool
$c/= :: forall a. Eq a => C172Arms a -> C172Arms a -> Bool
== :: C172Arms a -> C172Arms a -> Bool
$c== :: forall a. Eq a => C172Arms a -> C172Arms a -> Bool
Eq, Eq (C172Arms a)
Eq (C172Arms a)
-> (C172Arms a -> C172Arms a -> Ordering)
-> (C172Arms a -> C172Arms a -> Bool)
-> (C172Arms a -> C172Arms a -> Bool)
-> (C172Arms a -> C172Arms a -> Bool)
-> (C172Arms a -> C172Arms a -> Bool)
-> (C172Arms a -> C172Arms a -> C172Arms a)
-> (C172Arms a -> C172Arms a -> C172Arms a)
-> Ord (C172Arms a)
C172Arms a -> C172Arms a -> Bool
C172Arms a -> C172Arms a -> Ordering
C172Arms a -> C172Arms a -> C172Arms a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (C172Arms a)
forall a. Ord a => C172Arms a -> C172Arms a -> Bool
forall a. Ord a => C172Arms a -> C172Arms a -> Ordering
forall a. Ord a => C172Arms a -> C172Arms a -> C172Arms a
min :: C172Arms a -> C172Arms a -> C172Arms a
$cmin :: forall a. Ord a => C172Arms a -> C172Arms a -> C172Arms a
max :: C172Arms a -> C172Arms a -> C172Arms a
$cmax :: forall a. Ord a => C172Arms a -> C172Arms a -> C172Arms a
>= :: C172Arms a -> C172Arms a -> Bool
$c>= :: forall a. Ord a => C172Arms a -> C172Arms a -> Bool
> :: C172Arms a -> C172Arms a -> Bool
$c> :: forall a. Ord a => C172Arms a -> C172Arms a -> Bool
<= :: C172Arms a -> C172Arms a -> Bool
$c<= :: forall a. Ord a => C172Arms a -> C172Arms a -> Bool
< :: C172Arms a -> C172Arms a -> Bool
$c< :: forall a. Ord a => C172Arms a -> C172Arms a -> Bool
compare :: C172Arms a -> C172Arms a -> Ordering
$ccompare :: forall a. Ord a => C172Arms a -> C172Arms a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (C172Arms a)
Ord, Int -> C172Arms a -> ShowS
[C172Arms a] -> ShowS
C172Arms a -> String
(Int -> C172Arms a -> ShowS)
-> (C172Arms a -> String)
-> ([C172Arms a] -> ShowS)
-> Show (C172Arms a)
forall a. Show a => Int -> C172Arms a -> ShowS
forall a. Show a => [C172Arms a] -> ShowS
forall a. Show a => C172Arms a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [C172Arms a] -> ShowS
$cshowList :: forall a. Show a => [C172Arms a] -> ShowS
show :: C172Arms a -> String
$cshow :: forall a. Show a => C172Arms a -> String
showsPrec :: Int -> C172Arms a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> C172Arms a -> ShowS
Show)

makeClassy ''C172Arms

instance Functor C172Arms where
  fmap :: (a -> b) -> C172Arms a -> C172Arms b
fmap a -> b
k (C172Arms a
t a
r a
f a
a a
b) =
    b -> b -> b -> b -> b -> C172Arms b
forall a. a -> a -> a -> a -> a -> C172Arms a
C172Arms (a -> b
k a
t) (a -> b
k a
r) (a -> b
k a
f) (a -> b
k a
a) (a -> b
k a
b)

instance Applicative C172Arms where
  pure :: a -> C172Arms a
pure a
a =
    a -> a -> a -> a -> a -> C172Arms a
forall a. a -> a -> a -> a -> a -> C172Arms a
C172Arms a
a a
a a
a a
a a
a
  C172Arms a -> b
f1 a -> b
f2 a -> b
f3 a -> b
f4 a -> b
f5 <*> :: C172Arms (a -> b) -> C172Arms a -> C172Arms b
<*> C172Arms a
a1 a
a2 a
a3 a
a4 a
a5 =
    b -> b -> b -> b -> b -> C172Arms b
forall a. a -> a -> a -> a -> a -> C172Arms a
C172Arms (a -> b
f1 a
a1) (a -> b
f2 a
a2) (a -> b
f3 a
a3) (a -> b
f4 a
a4) (a -> b
f5 a
a5)

instance Foldable C172Arms where
  foldr :: (a -> b -> b) -> b -> C172Arms a -> b
foldr a -> b -> b
k b
z (C172Arms a
t a
r a
f a
a a
b) =
    (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> b -> b
k b
z [a
t,a
r,a
f,a
a,a
b]

instance Traversable C172Arms where
  traverse :: (a -> f b) -> C172Arms a -> f (C172Arms b)
traverse a -> f b
k (C172Arms a
t a
r a
f a
a a
b) =
    b -> b -> b -> b -> b -> C172Arms b
forall a. a -> a -> a -> a -> a -> C172Arms a
C172Arms (b -> b -> b -> b -> b -> C172Arms b)
-> f b -> f (b -> b -> b -> b -> C172Arms b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
k a
t f (b -> b -> b -> b -> C172Arms b)
-> f b -> f (b -> b -> b -> C172Arms b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> f b
k a
r f (b -> b -> b -> C172Arms b) -> f b -> f (b -> b -> C172Arms b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> f b
k a
f f (b -> b -> C172Arms b) -> f b -> f (b -> C172Arms b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> f b
k a
a f (b -> C172Arms b) -> f b -> f (C172Arms b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> f b
k a
b

c172ArmsPOH ::
  C172Arms Arm
c172ArmsPOH :: C172Arms Arm
c172ArmsPOH =
  Arm -> Arm -> Arm -> Arm -> Arm -> C172Arms Arm
forall a. a -> a -> a -> a -> a -> C172Arms a
C172Arms
    (ArmStatic -> ArmRange -> Arm
rangeArm (Rational
37 Rational -> Getting ArmStatic Rational ArmStatic -> ArmStatic
forall s a. s -> Getting a s a -> a
^. Getting ArmStatic Rational ArmStatic
forall a. Inches a => Iso' Rational a
inches) (Rational
34 Rational
-> Getting ArmRangeLower Rational ArmRangeLower -> ArmRangeLower
forall s a. s -> Getting a s a -> a
^. Getting ArmRangeLower Rational ArmRangeLower
forall a. Inches a => Iso' Rational a
inches ArmRangeLower -> ArmRangeUpper -> ArmRange
.->. Rational
46 Rational
-> Getting ArmRangeUpper Rational ArmRangeUpper -> ArmRangeUpper
forall s a. s -> Getting a s a -> a
^. Getting ArmRangeUpper Rational ArmRangeUpper
forall a. Inches a => Iso' Rational a
inches))
    (ArmStatic -> Arm
staticArm (Rational
73 Rational -> Getting ArmStatic Rational ArmStatic -> ArmStatic
forall s a. s -> Getting a s a -> a
^. Getting ArmStatic Rational ArmStatic
forall a. Inches a => Iso' Rational a
inches))
    (ArmStatic -> Arm
staticArm (Rational
48 Rational -> Getting ArmStatic Rational ArmStatic -> ArmStatic
forall s a. s -> Getting a s a -> a
^. Getting ArmStatic Rational ArmStatic
forall a. Inches a => Iso' Rational a
inches))
    (ArmStatic -> ArmRange -> Arm
rangeArm (Rational
95 Rational -> Getting ArmStatic Rational ArmStatic -> ArmStatic
forall s a. s -> Getting a s a -> a
^. Getting ArmStatic Rational ArmStatic
forall a. Inches a => Iso' Rational a
inches) (Rational
82 Rational
-> Getting ArmRangeLower Rational ArmRangeLower -> ArmRangeLower
forall s a. s -> Getting a s a -> a
^. Getting ArmRangeLower Rational ArmRangeLower
forall a. Inches a => Iso' Rational a
inches ArmRangeLower -> ArmRangeUpper -> ArmRange
.->. Rational
108 Rational
-> Getting ArmRangeUpper Rational ArmRangeUpper -> ArmRangeUpper
forall s a. s -> Getting a s a -> a
^. Getting ArmRangeUpper Rational ArmRangeUpper
forall a. Inches a => Iso' Rational a
inches))
    (ArmStatic -> ArmRange -> Arm
rangeArm (Rational
123 Rational -> Getting ArmStatic Rational ArmStatic -> ArmStatic
forall s a. s -> Getting a s a -> a
^. Getting ArmStatic Rational ArmStatic
forall a. Inches a => Iso' Rational a
inches) (Rational
108 Rational
-> Getting ArmRangeLower Rational ArmRangeLower -> ArmRangeLower
forall s a. s -> Getting a s a -> a
^. Getting ArmRangeLower Rational ArmRangeLower
forall a. Inches a => Iso' Rational a
inches ArmRangeLower -> ArmRangeUpper -> ArmRange
.->. Rational
142 Rational
-> Getting ArmRangeUpper Rational ArmRangeUpper -> ArmRangeUpper
forall s a. s -> Getting a s a -> a
^. Getting ArmRangeUpper Rational ArmRangeUpper
forall a. Inches a => Iso' Rational a
inches))