{-# 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