coordinate 0.0.4 → 0.0.5
raw patch · 3 files changed
+97/−8 lines, 3 files
Files
- coordinate.cabal +1/−1
- src/Data/Geo/Coordinate/Latitude.hs +47/−4
- src/Data/Geo/Coordinate/Longitude.hs +49/−3
coordinate.cabal view
@@ -1,5 +1,5 @@ name: coordinate-version: 0.0.4+version: 0.0.5 license: BSD3 license-File: etc/LICENCE author: Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
src/Data/Geo/Coordinate/Latitude.hs view
@@ -3,16 +3,17 @@ , HasLatitude(..) , dmsLatitude , fracLatitude+, radianLatitude ) where -import Prelude(Double, Eq, Show, Ord(..), Num(..), Bool(..), Monad(..), id, (&&), properFraction, fromIntegral)+import Prelude(Double, Eq, Show, Ord(..), Num(..), Floating(..), Fractional(..), Bool(..), Monad(..), id, (&&), (.), properFraction, fromIntegral) import Control.Lens(Iso', Prism', Lens', iso, prism', lens, (#), (^?)) import Data.Geo.Coordinate.DegreesLatitude import Data.Geo.Coordinate.Minutes import Data.Geo.Coordinate.Seconds -- $setup--- >>> import Control.Lens((^?))+-- >>> import Prelude(Functor(..)) data Latitude = Latitude@@ -43,12 +44,18 @@ -- -- >>> do deg <- 89 ^? nDegreesLatitude; min <- 59 ^? nMinutes; sec <- 60 ^? nSeconds; (deg, min, sec) ^? dmsLatitude -- Nothing+--+-- >>> fmap (dmsLatitude #) (7 ^? fracLatitude)+-- Just (DegreesLatitude 7,Minutes 0,Seconds 0.0000)+--+-- >>> fmap (dmsLatitude #) (7.12 ^? fracLatitude)+-- Just (DegreesLatitude 7,Minutes 7,Seconds 12.0000) dmsLatitude :: Iso' (DegreesLatitude, Minutes, Seconds) Latitude dmsLatitude = iso (\(d, m, s) -> Latitude d m s) (\(Latitude d m s) -> (d, m, s)) --- | A prism on latitude to a double between -90 and 90 inclusive.+-- | A prism on latitude to a double between -90 and 90 exclusive. -- -- >>> 7 ^? fracLatitude -- Just (Latitude (DegreesLatitude 7) (Minutes 0) (Seconds 0.0000))@@ -76,17 +83,53 @@ -- -- >>> 89.2 ^? fracLatitude -- Just (Latitude (DegreesLatitude 89) (Minutes 12) (Seconds 0.0000))+--+-- >>> fmap (fracLatitude #) (do deg <- 7 ^? nDegreesLatitude; min <- 7 ^? nMinutes; sec <- 7 ^? nSeconds; (deg, min, sec) ^? dmsLatitude)+-- Just 7.118611111111111+--+-- >>> fmap (fracLatitude #) (do deg <- 89 ^? nDegreesLatitude; min <- 15 ^? nMinutes; sec <- 6 ^? nSeconds; (deg, min, sec) ^? dmsLatitude)+-- Just 89.25166666666667 fracLatitude :: Prism' Double Latitude fracLatitude = prism' (\(Latitude d m s) ->- fromIntegral (nDegreesLatitude # d) + nSeconds # s + fromIntegral (nMinutes # m * 60))+ fromIntegral (nDegreesLatitude # d) + (fromIntegral (nMinutes # m) / 60) + (nSeconds # s) / 3600) (\x -> let (d, z) = properFraction x (m, s) = properFraction ((z :: Double) * 60) in do d' <- d ^? nDegreesLatitude m' <- abs m ^? nMinutes s' <- (abs s * 60) ^? nSeconds return (Latitude d' m' s'))++-- | A prism on latitude to a double between -π/2 and π/2 exclusive.+--+-- >>> 0.2 ^? radianLatitude+-- Just (Latitude (DegreesLatitude 11) (Minutes 27) (Seconds 32.9612))+--+-- >>> 1.3 ^? radianLatitude+-- Just (Latitude (DegreesLatitude 74) (Minutes 29) (Seconds 4.2481))+--+-- >>> (-1.3) ^? radianLatitude+-- Just (Latitude (DegreesLatitude (-74)) (Minutes 29) (Seconds 4.2481))+--+-- >>> 1.5707963 ^? radianLatitude+-- Just (Latitude (DegreesLatitude 89) (Minutes 59) (Seconds 59.9945))+--+-- >>> 1.58 ^? radianLatitude+-- Nothing+--+-- >>> (-1.58) ^? radianLatitude+-- Nothing+--+-- >>> fmap (radianLatitude #) (do deg <- 7 ^? nDegreesLatitude; min <- 7 ^? nMinutes; sec <- 7 ^? nSeconds; (deg, min, sec) ^? dmsLatitude)+-- Just 0.12424320205794079+--+-- >>> fmap (radianLatitude #) (do deg <- 89 ^? nDegreesLatitude; min <- 15 ^? nMinutes; sec <- 6 ^? nSeconds; (deg, min, sec) ^? dmsLatitude)+-- Just 1.5577354462258057+radianLatitude ::+ Prism' Double Latitude+radianLatitude =+ iso (\n -> n * 180 / pi) (\n -> n * pi / 180) . fracLatitude class HasLatitude t where latitude ::
src/Data/Geo/Coordinate/Longitude.hs view
@@ -3,14 +3,18 @@ , HasLongitude(..) , dmsLongitude , fracLongitude+, radianLongitude ) where -import Prelude(Double, Eq, Show, Ord(..), Num(..), Bool(..), Monad(..), id, (&&), properFraction, fromIntegral)+import Prelude(Double, Eq, Show, Ord(..), Num(..), Floating(..), Fractional(..), Bool(..), Monad(..), id, (&&), (.), properFraction, fromIntegral) import Control.Lens(Iso', Prism', Lens', iso, prism', lens, (#), (^?)) import Data.Geo.Coordinate.DegreesLongitude import Data.Geo.Coordinate.Minutes import Data.Geo.Coordinate.Seconds +-- $setup+-- >>> import Prelude(Functor(..))+ data Longitude = Longitude DegreesLongitude@@ -40,12 +44,18 @@ -- -- >>> do deg <- 179 ^? nDegreesLongitude; min <- 59 ^? nMinutes; sec <- 60 ^? nSeconds; (deg, min, sec) ^? dmsLongitude -- Nothing+--+-- >>> fmap (dmsLongitude #) (7 ^? fracLongitude)+-- Just (DegreesLongitude 7,Minutes 0,Seconds 0.0000)+--+-- >>> fmap (dmsLongitude #) (7.12 ^? fracLongitude)+-- Just (DegreesLongitude 7,Minutes 7,Seconds 12.0000) dmsLongitude :: Iso' (DegreesLongitude, Minutes, Seconds) Longitude dmsLongitude = iso (\(d, m, s) -> Longitude d m s) (\(Longitude d m s) -> (d, m, s)) --- | A prism on longitude to a double between -180 and 180 inclusive.+-- | A prism on longitude to a double between -180 and 180 exclusive. -- -- >>> 7 ^? fracLongitude -- Just (Longitude (DegreesLongitude 7) (Minutes 0) (Seconds 0.0000))@@ -73,17 +83,53 @@ -- -- >>> 179.2 ^? fracLongitude -- Just (Longitude (DegreesLongitude 179) (Minutes 11) (Seconds 60.0000))+--+-- >>> fmap (fracLongitude #) (do deg <- 7 ^? nDegreesLongitude; min <- 7 ^? nMinutes; sec <- 7 ^? nSeconds; (deg, min, sec) ^? dmsLongitude)+-- Just 7.118611111111111+--+-- >>> fmap (fracLongitude #) (do deg <- 179 ^? nDegreesLongitude; min <- 15 ^? nMinutes; sec <- 6 ^? nSeconds; (deg, min, sec) ^? dmsLongitude)+-- Just 179.25166666666667 fracLongitude :: Prism' Double Longitude fracLongitude = prism' (\(Longitude d m s) ->- fromIntegral (nDegreesLongitude # d) + nSeconds # s + fromIntegral (nMinutes # m * 60))+ fromIntegral (nDegreesLongitude # d) + (fromIntegral (nMinutes # m) / 60) + (nSeconds # s) / 3600) (\x -> let (d, z) = properFraction x (m, s) = properFraction ((z :: Double) * 60) in do d' <- d ^? nDegreesLongitude m' <- abs m ^? nMinutes s' <- (abs s * 60) ^? nSeconds return (Longitude d' m' s'))++-- | A prism on longitude to a double between -π and π exclusive.+--+-- >>> 0.2 ^? radianLongitude+-- Just (Longitude (DegreesLongitude 11) (Minutes 27) (Seconds 32.9612))+--+-- >>> 1.3 ^? radianLongitude+-- Just (Longitude (DegreesLongitude 74) (Minutes 29) (Seconds 4.2481))+--+-- >>> (-1.3) ^? radianLongitude+-- Just (Longitude (DegreesLongitude (-74)) (Minutes 29) (Seconds 4.2481))+--+-- >>> 3.14159 ^? radianLongitude+-- Just (Longitude (DegreesLongitude 179) (Minutes 59) (Seconds 59.4527))+--+-- >>> 3.15 ^? radianLongitude+-- Nothing+--+-- >>> (-3.15) ^? radianLongitude+-- Nothing+--+-- >>> fmap (radianLongitude #) (do deg <- 7 ^? nDegreesLongitude; min <- 7 ^? nMinutes; sec <- 7 ^? nSeconds; (deg, min, sec) ^? dmsLongitude)+-- Just 0.12424320205794079+--+-- >>> fmap (radianLongitude #) (do deg <- 179 ^? nDegreesLongitude; min <- 15 ^? nMinutes; sec <- 6 ^? nSeconds; (deg, min, sec) ^? dmsLongitude)+-- Just 3.1285317730207023+radianLongitude ::+ Prism' Double Longitude+radianLongitude =+ iso (\n -> n * 180 / pi) (\n -> n * pi / 180) . fracLongitude class HasLongitude t where longitude ::