{-# LANGUAGE NamedFieldPuns #-}

module Web.OpenWeatherMap.Formulas
  ( absoluteHumidity
  ) where

import Web.OpenWeatherMap.Types.Main

{-- | Calculate absolute humidity (g/m³)

Returns 'Nothing' if the temperature is out of range (−30°C,  +35°C).

-}
absoluteHumidity :: Main -> Maybe Double
absoluteHumidity :: Main -> Maybe Double
absoluteHumidity Main {Double
temp :: Main -> Double
temp :: Double
temp, Double
humidity :: Main -> Double
humidity :: Double
humidity}
  | Double
tC forall a. Ord a => a -> a -> Bool
> -Double
30 Bool -> Bool -> Bool
&& Double
tC forall a. Ord a => a -> a -> Bool
< Double
35 = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double
ahBolton1980 Double
temp Double
humidity
  | Bool
otherwise = forall a. Maybe a
Nothing
  where
    tC :: Double
tC = Double -> Double
k2c Double
temp

{-- | Calculate absolute humidity (g/m³)

Ref.: Bolton D. "The Computation of Equivalent Potential Temperature",
Monthly Weather Review, 1980, 108(7):1046–1053.

-}
ahBolton1980 ::
     Double -- ^ Temperature in Kelvins
  -> Double -- ^ Relative humidity in %
  -> Double
ahBolton1980 :: Double -> Double -> Double
ahBolton1980 Double
temp Double
humidity =
  Double
13.25 forall a. Num a => a -> a -> a
* Double
humidity forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
exp (Double
17.67 forall a. Num a => a -> a -> a
* Double
tC forall a. Fractional a => a -> a -> a
/ (Double
tC forall a. Num a => a -> a -> a
+ Double
243.5)) forall a. Fractional a => a -> a -> a
/ Double
temp
  where
    tC :: Double
tC = Double -> Double
k2c Double
temp

k2c :: Double -> Double
k2c :: Double -> Double
k2c Double
t = Double
t forall a. Num a => a -> a -> a
- Double
273.15