packages feed

aviation-weight-balance (empty) → 0.0.2

raw patch · 15 files changed

+919/−0 lines, 15 filesdep +aviation-unitsdep +basedep +lenssetup-changed

Dependencies added: aviation-units, base, lens, semigroups

Files

+ LICENCE view
@@ -0,0 +1,31 @@+Copyright (c) 2017-2019, Commonwealth Scientific and Industrial Research Organisation+Copyright (c) 2019-2021, Tony Morris++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of QFPL nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ aviation-weight-balance.cabal view
@@ -0,0 +1,53 @@+name:               aviation-weight-balance+version:            0.0.2+license:            BSD3+license-file:       LICENCE+author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>, Joshua Morris <ɯoɔ˙lᴉɐɯƃ@llǝʞsɐɥ+sᴉɹɹoɯuɥoɾɐnɥsoɾ>+maintainer:         Tony Morris, Joshua Morris+copyright:          Copyright (c) 2019-2021, Tony Morris+synopsis:           Weight and Balance structures used in aviation.+category:           Aviation+description:+  Weight and Balance used in aviation.++homepage:           https://gitlab.com/tonymorris/aviation-weight-balance+bug-reports:        https://gitlab.com/tonymorris/aviation-weight-balance/issues+cabal-version:      >= 1.10+build-type:         Simple+extra-source-files: changelog++source-repository   head+  type:             git+  location:         git@gitlab.com:tonymorris/aviation-weight-balance.git++library+  default-language:+                    Haskell2010++  build-depends:+                    base >= 4.8 && < 5+                    , lens >= 4.15 && < 5+                    , aviation-units >= 0.0.2 && < 1++  if impl(ghc < 8)+    build-depends:+      semigroups >= 0.9 && < 0.19++  ghc-options:+                    -Wall++  hs-source-dirs:+                    src++  exposed-modules:+                    Data.Aviation.WB+                    Data.Aviation.WB.Arm+                    Data.Aviation.WB.Arm.Arm+                    Data.Aviation.WB.Arm.ArmRange+                    Data.Aviation.WB.Arm.ArmRangeLower+                    Data.Aviation.WB.Arm.ArmStatic+                    Data.Aviation.WB.Arm.ArmRangeUpper+                    Data.Aviation.WB.Avgas100LL+                    Data.Aviation.WB.Moment+                    Data.Aviation.WB.Volume+                    Data.Aviation.WB.Weight
+ changelog view
@@ -0,0 +1,7 @@+0.0.2++* Update GHC++0.0.1++* Initial release
+ src/Data/Aviation/WB.hs view
@@ -0,0 +1,11 @@+{-# LANGUAGE NoImplicitPrelude #-}++module Data.Aviation.WB(+  module A+) where++import Data.Aviation.WB.Arm as A+import Data.Aviation.WB.Avgas100LL as A+import Data.Aviation.WB.Moment as A+import Data.Aviation.WB.Volume as A+import Data.Aviation.WB.Weight as A
+ src/Data/Aviation/WB/Arm.hs view
@@ -0,0 +1,11 @@+{-# LANGUAGE NoImplicitPrelude #-}++module Data.Aviation.WB.Arm(+  module A+) where++import Data.Aviation.WB.Arm.Arm as A+import Data.Aviation.WB.Arm.ArmRange as A+import Data.Aviation.WB.Arm.ArmRangeLower as A+import Data.Aviation.WB.Arm.ArmStatic as A+import Data.Aviation.WB.Arm.ArmRangeUpper as A
+ src/Data/Aviation/WB/Arm/Arm.hs view
@@ -0,0 +1,116 @@+{-# 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)
+ src/Data/Aviation/WB/Arm/ArmRange.hs view
@@ -0,0 +1,90 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.Aviation.WB.Arm.ArmRange(+  ArmRange(..)+, HasArmRange(..)+, HasArmRanges(..)+, SetArmRange(..)+, HasArmRange0(..)+, (.->.)+) where++import Control.Lens(Lens', Traversal', Setter', lens, makeClassy)+import Data.Aviation.WB.Arm.ArmRangeLower(ArmRangeLower, HasArmRangeLower(armRangeLower), HasArmRangeLowers(armRangeLowers), SetArmRangeLower(setArmRangeLower))+import Data.Aviation.WB.Arm.ArmRangeUpper(ArmRangeUpper, HasArmRangeUpper(armRangeUpper), HasArmRangeUppers(armRangeUppers), SetArmRangeUpper(setArmRangeUpper))+import Data.Eq(Eq)+import Data.Maybe(Maybe)+import Data.Ord(Ord)+import Prelude(Show)++data ArmRange =+  ArmRange+    ArmRangeLower+    ArmRangeUpper+  deriving (Eq, Ord, Show)++makeClassy ''ArmRange++(.->.) ::+  ArmRangeLower+  -> ArmRangeUpper+  -> ArmRange+(.->.) =+  ArmRange++infixl 2 .->. ++class HasArmRanges a where+  armRanges ::+    Traversal'+      a+      ArmRange++instance HasArmRanges ArmRange where+  armRanges =+    armRange++class SetArmRange a where+  setArmRange ::+    Setter'+      a+      ArmRange++instance SetArmRange ArmRange where+  setArmRange =+    armRange++instance HasArmRangeLower ArmRange where+  armRangeLower =+    lens+      (\(ArmRange lower _) -> lower)+      (\(ArmRange _ upper) lower -> ArmRange lower upper)++instance HasArmRangeUpper ArmRange where+  armRangeUpper =+    lens+      (\(ArmRange _ upper) -> upper)+      (\(ArmRange lower _) upper -> ArmRange lower upper)++instance HasArmRangeLowers ArmRange where+  armRangeLowers =+    armRangeLower+    +instance HasArmRangeUppers ArmRange where+  armRangeUppers =+    armRangeUpper++instance SetArmRangeLower ArmRange where+  setArmRangeLower =+    armRangeLower+    +instance SetArmRangeUpper ArmRange where+  setArmRangeUpper =+    armRangeUpper++class HasArmRange0 a where+  armRange0 ::+    Lens'+      a+      (Maybe ArmRange)
+ src/Data/Aviation/WB/Arm/ArmRangeLower.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.Aviation.WB.Arm.ArmRangeLower(+  ArmRangeLower+, HasArmRangeLower(..)+, HasArmRangeLowers(..)+, SetArmRangeLower(..)+, HasArmRangeLower0(..)+) where++import Control.Category((.))+import Control.Lens(Lens', Traversal', Setter', makeClassy, iso)+import Data.Aviation.Units(Inches(inches), Centimetres(centimetres), Thouinches(thouinches))+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(dividing, multiplying)+import Prelude(Show, Rational, (+))++newtype ArmRangeLower =+  ArmRangeLower+    Rational+  deriving (Eq, Ord, Show)++makeClassy ''ArmRangeLower++class HasArmRangeLowers a where+  armRangeLowers ::+    Traversal'+      a+      ArmRangeLower++instance HasArmRangeLowers ArmRangeLower where+  armRangeLowers =+    armRangeLower++class SetArmRangeLower a where+  setArmRangeLower ::+    Setter'+      a+      ArmRangeLower++instance SetArmRangeLower ArmRangeLower where+  setArmRangeLower =+    armRangeLower++class HasArmRangeLower0 a where+  armRangeLower0 ::+    Lens'+      a+      (Maybe ArmRangeLower)++instance Inches ArmRangeLower where+  inches =+    iso+      ArmRangeLower+      (\(ArmRangeLower x) -> x)++instance Thouinches ArmRangeLower where+  thouinches =+    multiplying 1000 . inches++instance Centimetres ArmRangeLower where+  centimetres =+    dividing (254 % 100) . inches++instance Semigroup ArmRangeLower where+  (<>) =+    mappend++instance Monoid ArmRangeLower where+  mempty =+    ArmRangeLower 0+  ArmRangeLower w1 `mappend` ArmRangeLower w2 =+    ArmRangeLower (w1 + w2)
+ src/Data/Aviation/WB/Arm/ArmRangeUpper.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.Aviation.WB.Arm.ArmRangeUpper(+  ArmRangeUpper+, HasArmRangeUpper(..)+, HasArmRangeUppers(..)+, SetArmRangeUpper(..)+, HasArmRangeUpper0(..)+) where++import Control.Category((.))+import Control.Lens(Lens', Traversal', Setter', makeClassy, iso)+import Data.Aviation.Units(Inches(inches), Centimetres(centimetres), Thouinches(thouinches))+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(dividing, multiplying)+import Prelude(Show, Rational, (+))++newtype ArmRangeUpper =+  ArmRangeUpper+    Rational+  deriving (Eq, Ord, Show)++makeClassy ''ArmRangeUpper++class HasArmRangeUppers a where+  armRangeUppers ::+    Traversal'+      a+      ArmRangeUpper++instance HasArmRangeUppers ArmRangeUpper where+  armRangeUppers =+    armRangeUpper++class SetArmRangeUpper a where+  setArmRangeUpper ::+    Setter'+      a+      ArmRangeUpper++instance SetArmRangeUpper ArmRangeUpper where+  setArmRangeUpper =+    armRangeUpper++class HasArmRangeUpper0 a where+  armRangeUpper0 ::+    Lens'+      a+      (Maybe ArmRangeUpper)++instance Inches ArmRangeUpper where+  inches =+    iso+      ArmRangeUpper+      (\(ArmRangeUpper x) -> x)++instance Thouinches ArmRangeUpper where+  thouinches =+    multiplying 1000 . inches++instance Centimetres ArmRangeUpper where+  centimetres =+    dividing (254 % 100) . inches+    +instance Semigroup ArmRangeUpper where+  (<>) =+    mappend++instance Monoid ArmRangeUpper where+  mempty =+    ArmRangeUpper 0+  ArmRangeUpper w1 `mappend` ArmRangeUpper w2 =+    ArmRangeUpper (w1 + w2)
+ src/Data/Aviation/WB/Arm/ArmStatic.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.Aviation.WB.Arm.ArmStatic(+  ArmStatic+, HasArmStatic(..)+, HasArmStatics(..)+, SetArmStatic(..)+, HasArmStatic0(..)+) where++import Control.Category((.))+import Control.Lens(Lens', Traversal', Setter', makeClassy, iso)+import Data.Aviation.Units(Inches(inches), Centimetres(centimetres), Thouinches(thouinches))+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(dividing, multiplying)+import Prelude(Show, Rational, (+))++newtype ArmStatic =+  ArmStatic+    Rational+  deriving (Eq, Ord, Show)++makeClassy ''ArmStatic++class HasArmStatics a where+  armStatics ::+    Traversal'+      a+      ArmStatic++instance HasArmStatics ArmStatic where+  armStatics =+    armStatic++class SetArmStatic a where+  setArmStatic ::+    Setter'+      a+      ArmStatic++instance SetArmStatic ArmStatic where+  setArmStatic =+    armStatic++class HasArmStatic0 a where+  armStatic0 ::+    Lens'+      a+      (Maybe ArmStatic)++instance Inches ArmStatic where+  inches =+    iso+      ArmStatic+      (\(ArmStatic x) -> x)++instance Thouinches ArmStatic where+  thouinches =+    multiplying 1000 . inches++instance Centimetres ArmStatic where+  centimetres =+    dividing (254 % 100) . inches++instance Semigroup ArmStatic where+  (<>) =+    mappend++instance Monoid ArmStatic where+  mempty =+    ArmStatic 0+  ArmStatic w1 `mappend` ArmStatic w2 =+    ArmStatic (w1 + w2)
+ src/Data/Aviation/WB/Avgas100LL.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FunctionalDependencies #-}++module Data.Aviation.WB.Avgas100LL(+  Avgas100LL(..)+) where++import Control.Category((.))+import Control.Lens(Iso', from)+import Data.Aviation.Units.USGallons(usgallons)+import Data.Aviation.Units.Pounds(pounds)+import Data.Aviation.WB.Weight(Weight)+import Data.Aviation.WB.Volume(Volume)+import Numeric.Lens(multiplying)++class Avgas100LL a b | a -> b, b -> a where+  avgas100LL ::+    Iso' a b++instance Avgas100LL Volume Weight where+  avgas100LL =+    from usgallons . multiplying 6 . pounds++instance Avgas100LL Weight Volume where+  avgas100LL =+    from avgas100LL
+ src/Data/Aviation/WB/Moment.hs view
@@ -0,0 +1,138 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE RankNTypes #-}++module Data.Aviation.WB.Moment(+  Moment(..)+, HasMoment(..)+, HasMoments(..)+, SetMoment(..)+, HasMoment0(..)+, totalMoment+, totalMoments+, totalMoment''+, totalWeights+, momentX+) where++import Control.Applicative(Applicative((<*>)))+import Control.Category((.))+import Control.Lens(Lens', Traversal', Setter', Iso', lens, makeClassy, view, re)+import Data.Aviation.WB.Arm.ArmStatic(ArmStatic, HasArmStatic(armStatic), HasArmStatics(armStatics), SetArmStatic(setArmStatic))+import Data.Aviation.WB.Weight(Weight, HasWeight(weight), HasWeights(weights), SetWeight(setWeight))+import Data.Eq(Eq)+import Data.Foldable(Foldable, foldl, foldMap)+import Data.Functor((<$>))+import Data.Maybe(Maybe)+import Data.Ord(Ord)+import Prelude(Show, (*), (+), Rational)++data Moment =+  Moment+    Weight+    ArmStatic+  deriving (Eq, Ord, Show)++makeClassy ''Moment++class HasMoments a where+  moments ::+    Traversal'+      a+      Moment++instance HasMoments Moment where+  moments =+    moment++class SetMoment a where+  setMoment ::+    Setter'+      a+      Moment++instance SetMoment Moment where+  setMoment =+    moment++class HasMoment0 a where+  moment0 ::+    Lens'+      a+      (Maybe Moment)++instance HasWeight Moment where+  weight =+    lens+      (\(Moment w _) -> w)+      (\(Moment _ a) w -> Moment w a)++instance HasWeights Moment where+  weights =+    weight++instance SetWeight Moment where+  setWeight =+    weight++instance HasArmStatic Moment where+  armStatic =+    lens+      (\(Moment _ a) -> a)+      (\(Moment w _) a -> Moment w a)++instance HasArmStatics Moment where+  armStatics =+    armStatic++instance SetArmStatic Moment where+  setArmStatic =+    armStatic++totalMoment ::+  HasMoment moment =>+  Iso' Rational Weight+  -> Iso' Rational ArmStatic+  -> moment+  -> Rational+totalMoment w a m =+  let r = view (moment . weight . re w) m+      s = view (moment . armStatic . re a) m+  in  r * s+  +totalMoments ::+  (HasMoment moment, Foldable f) =>+  Iso' Rational Weight+  -> Iso' Rational ArmStatic+  -> f moment+  -> Rational+totalMoments w a =+  foldl (\x y -> x + totalMoment w a y) 0+++totalMoment'' ::+  (HasMoment moment, Foldable f) =>+  Iso' Rational Weight+  -> Iso' Rational ArmStatic+  -> f moment+  -> Moment+totalMoment'' w a m =+  let (mw, ma) = foldl (\(w', a') n ->  let w'' = view (moment . weight . re w) n+                                            a'' = view (moment . armStatic . re a) n+                                        in  (w' + w'', a' + w'' * a'')) (0, 0) m+  in  Moment (view w mw) (view a ma)++totalWeights ::+  (HasMoment moment, Foldable f) =>+  f moment+  -> Weight+totalWeights =+  foldMap (view (moment . weight))+    +momentX :: +  (HasWeight w, HasArmStatic s, Applicative f) =>+  f w+  -> f s+  -> f Moment+momentX wt b =+  (\w -> Moment (view weight w) . view armStatic) <$> wt <*> b
+ src/Data/Aviation/WB/Volume.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.Aviation.WB.Volume(+  Volume+, HasVolume(..)+, HasVolumes(..)+, SetVolume(..)+, HasVolume0(..)+, usgallonsV+, litresV+, imperialgallonsV+) where++import Control.Category((.))+import Control.Lens(makeClassy, Traversal', Setter', Lens', Iso', iso)+import Data.Aviation.Units.ImperialGallons(ImperialGallons(imperialgallons))+import Data.Aviation.Units.USGallons(USGallons(usgallons))+import Data.Aviation.Units.Litres(Litres(litres))+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, dividing)+import Prelude(Show, Rational, (+), (*))++newtype Volume =+  Volume+    Rational+  deriving (Eq, Ord, Show)++makeClassy ''Volume++class HasVolumes a where+  volumes ::+    Traversal'+      a+      Volume++instance HasVolumes Volume where+  volumes =+    volume++class SetVolume a where+  setVolume ::+    Setter'+      a+      Volume++instance SetVolume Volume where+  setVolume =+    volume++class HasVolume0 a where+  volume0 ::+    Lens'+      a+      (Maybe Volume)++instance Semigroup Volume where+  (<>) =+    mappend++instance Monoid Volume where+  mempty =+    Volume 0+  Volume w1 `mappend` Volume w2 =+    Volume (w1 + w2)++instance USGallons Volume where+  usgallons =+    iso+      Volume+      (\(Volume x) -> x)++instance Litres Volume where+  litres =+    dividing ((254 * 254 * 254 * 231) % 1000000000) . usgallons++instance ImperialGallons Volume where+  imperialgallons =+    multiplying (454609 % 100000) . litres++usgallonsV ::+  Iso'+    Rational+    Volume+usgallonsV =+  usgallons++litresV ::+  Iso'+    Rational+    Volume+litresV =+  litres++imperialgallonsV ::+  Iso'+    Rational+    Volume+imperialgallonsV =+  imperialgallons
+ src/Data/Aviation/WB/Weight.hs view
@@ -0,0 +1,91 @@+{-# 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