module Data.Measure.Length(LengthMeasure,
nm,
yoctometres,
zeptometres,
attometres,
femtometres,
fermis,
picometres,
nanometres,
micrometres,
millimetres,
centimetres,
decimetres,
metres,
kilometres,
au,
lightSeconds,
lightMinutes,
lightHours,
lightDays,
lightYears,
parsecs,
ells,
inches,
thou,
feet,
yards,
quarters,
miles,
nauticalMiles,
nauticalMilesAdmiralty,
fathoms,
cables,
chains,
furlongs,
Length,
nm',
length') where
import Data.Measure.RelativeDouble
import Data.Measure.ConvertDouble
newtype LengthMeasure = Nanometre {
nm :: Double
} deriving (Eq, Ord, Enum, Num, Fractional, Floating)
instance Show LengthMeasure where
show = show . nm
yoctometres :: LengthMeasure
yoctometres = zeptometres ./. 1000
zeptometres :: LengthMeasure
zeptometres = attometres ./. 1000
attometres :: LengthMeasure
attometres = femtometres ./. 1000
femtometres :: LengthMeasure
femtometres = picometres ./. 1000
fermis :: LengthMeasure
fermis = femtometres
picometres :: LengthMeasure
picometres = nanometres ./. 1000
nanometres :: LengthMeasure
nanometres = Nanometre 1
micrometres :: LengthMeasure
micrometres = nanometres .*. 1000
millimetres :: LengthMeasure
millimetres = micrometres .*. 1000
centimetres :: LengthMeasure
centimetres = millimetres .*. 10
decimetres :: LengthMeasure
decimetres = centimetres .*. 10
metres :: LengthMeasure
metres = millimetres .*. 1000
kilometres :: LengthMeasure
kilometres = metres .*. 1000
au :: LengthMeasure
au = metres .*. 149597871464
lightSeconds :: LengthMeasure
lightSeconds = metres .*. 299792458
lightMinutes :: LengthMeasure
lightMinutes = lightSeconds .*. 60
lightHours :: LengthMeasure
lightHours = lightMinutes .*. 60
lightDays :: LengthMeasure
lightDays = lightHours .*. 24
lightYears :: LengthMeasure
lightYears = metres .*. 9460730472580800
parsecs :: LengthMeasure
parsecs = kilometres .*. 30856778200000
ells :: LengthMeasure
ells = metres .*. 1.143
inches :: LengthMeasure
inches = millimetres .*. 25.4
thou :: LengthMeasure
thou = inches ./. 1000
feet :: LengthMeasure
feet = inches .*. 12
yards :: LengthMeasure
yards = feet .*. 3
quarters :: LengthMeasure
quarters = yards ./. 4
miles :: LengthMeasure
miles = yards .*. 1760
nauticalMiles :: LengthMeasure
nauticalMiles = metres .*. 1852
nauticalMilesAdmiralty :: LengthMeasure
nauticalMilesAdmiralty = feet .*. 6080
fathoms :: LengthMeasure
fathoms = micrometres .*. 1828800
cables :: LengthMeasure
cables = fathoms .*. 100
chains :: LengthMeasure
chains = feet .*. 66
furlongs :: LengthMeasure
furlongs = chains .*. 10
newtype Length = Length {
nm' :: Double
} deriving (Eq, Ord, Enum, Num, Fractional, Floating)
length' :: Double -> Length
length' = Length
instance Show Length where
show (Length d) = show d ++ "nm"
instance RelativeDouble LengthMeasure where
Nanometre n .*. r = Nanometre (n * r)
Nanometre n ./. r = Nanometre (n / r)
instance ConvertDouble LengthMeasure Length where
x ..> n = Length (x * nm n)
n <.. x = nm' n / nm x