packages feed

aviation-cessna172-weight-balance-0.0.2: src/Data/Aviation/C172/WB/C172AircraftArms.hs

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

module Data.Aviation.C172.WB.C172AircraftArms(
  C172AircraftArms(..)
, HasC172AircraftArms(..)
, bewC172AircraftArms
, zfwMoment
, ffwMoment
, ufwMoment
, totalC172Moment
) where

import Control.Applicative(Applicative((<*>), pure))
import Control.Category((.))
import Control.Lens(makeClassy, lens, (^.), (.~), (&))
import Data.Aviation.C172.WB.C172Arms(C172Arms, HasC172Arms(c172Arms), fuel, c172ArmsPOH)
import Data.Aviation.Units(Pounds(pounds))
import Data.Aviation.WB(ArmStatic)
import Data.Aviation.WB.Arm(Arm, HasArmStatic, staticArm)
import Data.Aviation.WB.Weight(HasWeight(weight))
import Data.Aviation.WB.Moment(Moment, momentX)
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 C172AircraftArms a =
  C172AircraftArms {
    _basicEmptyWeight ::
      a
  , c172Arms_ ::
      C172Arms a
  }
  deriving (Eq, Ord, Show)

makeClassy ''C172AircraftArms

instance HasC172Arms (C172AircraftArms a) a where
  c172Arms =
    lens
      (\(C172AircraftArms _ c) -> c)
      (\(C172AircraftArms c _) a -> C172AircraftArms c a)

instance Functor C172AircraftArms where
  fmap k (C172AircraftArms c x) =
    C172AircraftArms (k c) (fmap k x)

instance Applicative C172AircraftArms where
  pure a =
    C172AircraftArms a (pure a)
  C172AircraftArms c1 c2 <*> C172AircraftArms x1 x2 =
    C172AircraftArms (c1 x1) (c2 <*> x2)

instance Foldable C172AircraftArms where
  foldr k z (C172AircraftArms c x) =
    k c (foldr k z x)

instance Traversable C172AircraftArms where
  traverse k (C172AircraftArms c x) =
    C172AircraftArms <$> k c <*> traverse k x

bewC172AircraftArms ::
  ArmStatic
  -> C172AircraftArms Arm
bewC172AircraftArms a =
  C172AircraftArms
    (staticArm a)
    c172ArmsPOH

-- zero fuel
zfwMoment ::
  C172AircraftArms Moment
  -> C172AircraftArms Moment
zfwMoment x =
  x & fuel . weight .~ 0 ^. pounds

-- full fuel
ffwMoment ::
  C172AircraftArms Moment
  -> C172AircraftArms Moment
ffwMoment x =
  x & fuel . weight .~ 336 ^. pounds

-- unusable fuel
ufwMoment ::
  C172AircraftArms Moment
  -> C172AircraftArms Moment
ufwMoment x =
  x & fuel . weight .~ 18 ^. pounds


totalC172Moment ::
  (HasWeight w, HasArmStatic s) =>
  w
  -> C172Arms w
  -> C172AircraftArms s
  -> C172AircraftArms Moment
totalC172Moment bew wt am =
  momentX (C172AircraftArms bew wt) am