{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TemplateHaskell #-} module Data.Aviation.WB.Weight( Weight , HasWeight(..) , HasWeights(..) , SetWeight(..) , HasWeight0(..) , kilogramsW , poundsW ) where import Control.Category((.)) import Control.Lens(Iso', iso, Lens', Traversal', Setter', makeClassy, iso) import Data.Aviation.Units(Kilograms(kilograms), Pounds(pounds)) 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(multiplying) import Prelude(Show, Rational, (+)) newtype Weight = Weight Rational deriving (Eq, Ord, Show) makeClassy ''Weight class HasWeights a where weights :: Traversal' a Weight instance HasWeights Weight where weights = weight class SetWeight a where setWeight :: Setter' a Weight instance SetWeight Weight where setWeight = weight class HasWeight0 a where weight0 :: Lens' a (Maybe Weight) instance Semigroup Weight where (<>) = mappend instance Monoid Weight where mempty = Weight 0 Weight w1 `mappend` Weight w2 = Weight (w1 + w2) instance Kilograms Weight where kilograms = multiplying (22046226218 % 10000000000) . pounds instance Pounds Weight where pounds = iso Weight (\(Weight x) -> x) kilogramsW :: Iso' Rational Weight kilogramsW = kilograms poundsW :: Iso' Rational Weight poundsW = pounds