{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TemplateHaskell #-} module Data.Aviation.WB.Arm.Arm( Arm(..) , staticArm , rangeArm , HasArm(..) , HasArms(..) , SetArm(..) , HasArm0(..) ) where import Control.Category((.)) import Control.Lens(Lens', Traversal', Setter', lens, makeClassy) import Data.Aviation.WB.Arm.ArmRangeLower(HasArmRangeLowers(armRangeLowers), SetArmRangeLower(setArmRangeLower)) import Data.Aviation.WB.Arm.ArmRange(ArmRange, HasArmRanges(armRanges), SetArmRange(setArmRange), HasArmRange0(armRange0)) import Data.Aviation.WB.Arm.ArmStatic(ArmStatic, HasArmStatic(armStatic), HasArmStatics(armStatics), SetArmStatic(setArmStatic)) import Data.Aviation.WB.Arm.ArmRangeUpper(HasArmRangeUppers(armRangeUppers), SetArmRangeUpper(setArmRangeUpper)) import Data.Functor((<$>)) import Data.Traversable(traverse) import Data.Eq(Eq) import Data.Maybe(Maybe(Nothing, Just)) import Data.Ord(Ord) import Prelude(Show) data Arm = Arm ArmStatic (Maybe ArmRange) deriving (Eq, Ord, Show) makeClassy ''Arm staticArm :: ArmStatic -> Arm staticArm x = Arm x Nothing rangeArm :: ArmStatic -> ArmRange -> Arm rangeArm x = Arm x . Just class HasArms a where arms :: Traversal' a Arm instance HasArms Arm where arms = arm class SetArm a where setArm :: Setter' a Arm instance SetArm Arm where setArm = arm instance HasArmStatic Arm where armStatic = lens (\(Arm s _) -> s) (\(Arm _ r) s -> Arm s r) instance HasArmStatics Arm where armStatics = armStatic instance HasArmRanges Arm where armRanges f (Arm s r) = Arm s <$> traverse f r instance SetArmRange Arm where setArmRange = armRanges instance SetArmStatic Arm where setArmStatic = armStatic . setArmStatic instance HasArmRangeLowers Arm where armRangeLowers = armRanges . armRangeLowers instance HasArmRangeUppers Arm where armRangeUppers = armRanges . armRangeUppers instance SetArmRangeLower Arm where setArmRangeLower = setArmRange . setArmRangeLower instance SetArmRangeUpper Arm where setArmRangeUpper = setArmRange . setArmRangeUpper class HasArm0 a where arm0 :: Lens' a (Maybe Arm) instance HasArmRange0 Arm where armRange0 = lens (\(Arm _ r) -> r) (\(Arm s _) r -> Arm s r)