coordinate 0.0.9 → 0.0.10
raw patch · 8 files changed
+147/−53 lines, 8 filesdep +template-haskelldep +transformersdep ~lens
Dependencies added: template-haskell, transformers
Dependency ranges changed: lens
Files
- coordinate.cabal +11/−9
- src/Data/Geo/Coordinate/Coordinate.hs +66/−15
- src/Data/Geo/Coordinate/DegreesLatitude.hs +12/−5
- src/Data/Geo/Coordinate/DegreesLongitude.hs +12/−5
- src/Data/Geo/Coordinate/Latitude.hs +10/−4
- src/Data/Geo/Coordinate/Longitude.hs +11/−4
- src/Data/Geo/Coordinate/Minutes.hs +12/−5
- src/Data/Geo/Coordinate/Seconds.hs +13/−6
coordinate.cabal view
@@ -1,7 +1,7 @@ name: coordinate-version: 0.0.9+version: 0.0.10 license: BSD3-license-File: etc/LICENCE+license-file: etc/LICENCE author: Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ> maintainer: Tony Morris copyright: Copyright (C) 2013-2014 Tony Morris@@ -25,8 +25,9 @@ Haskell2010 build-depends:- base < 5 && >= 3- , lens >= 3.10+ base < 5 && >= 3+ , lens >= 4.0+ , transformers >= 0.3.0.0 ghc-options: -Wall@@ -58,11 +59,12 @@ Haskell2010 build-depends:- base < 5 && >= 3,- doctest >= 0.9.7,- filepath >= 1.3,- directory >= 1.1,- QuickCheck >= 2.0+ base < 5 && >= 3+ , doctest >= 0.9.7+ , filepath >= 1.3+ , directory >= 1.1+ , QuickCheck >= 2.0+ , template-haskell >= 2.8 ghc-options: -Wall
src/Data/Geo/Coordinate/Coordinate.hs view
@@ -1,7 +1,13 @@+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE RankNTypes #-}+ module Data.Geo.Coordinate.Coordinate( Coordinate , (.#.)-, (..#..)+, (<°>)+, (<㎭>)+, fracCoordinate+, radianCoordinate , HasCoordinate(..) , coordinateLatLon , coordinateLonLat@@ -10,15 +16,20 @@ , coordinateDMSLatDMSLon ) where -import Prelude(Eq, Show, Ord, Double, id, return, (.))+import Control.Category(Category(id, (.)))+import Control.Lens(Iso', Lens', Prism', iso, lens, prism', mapping, swapped, withIso, (^?), (#))+import Control.Monad(Monad(return))+import Data.Eq(Eq)+import Data.Geo.Coordinate.Latitude(HasLatitude(latitude), Latitude, dmsLatitude, radianLatitude, fracLatitude)+import Data.Geo.Coordinate.Longitude(HasLongitude(longitude), Longitude, dmsLongitude, radianLongitude, fracLongitude)+import Data.Geo.Coordinate.DegreesLatitude(HasDegreesLatitude(degreesLatitude), DegreesLatitude)+import Data.Geo.Coordinate.DegreesLongitude(HasDegreesLongitude(degreesLongitude), DegreesLongitude)+import Data.Geo.Coordinate.Minutes(Minutes)+import Data.Geo.Coordinate.Seconds(Seconds) import Data.Maybe(Maybe)-import Control.Lens(Iso', Lens', iso, lens, mapping, swapped, withIso, (^?))-import Data.Geo.Coordinate.Latitude-import Data.Geo.Coordinate.Longitude-import Data.Geo.Coordinate.DegreesLatitude-import Data.Geo.Coordinate.DegreesLongitude-import Data.Geo.Coordinate.Minutes-import Data.Geo.Coordinate.Seconds+import Data.Ord(Ord)+import Data.Tuple(curry, uncurry)+import Prelude(Show, Double) data Coordinate = Coordinate@@ -36,19 +47,59 @@ -- | Build a coordinate from a fractional latitude and fractional longitude. Fails -- if either are out of range.-(..#..) ::+(<°>) :: Double -> Double -> Maybe Coordinate-lat ..#.. lon =- do lat' <- lat ^? fracLatitude- lon' <- lon ^? fracLongitude- return (lat' .#. lon')+(<°>) =+ curry (^? fracCoordinate) +-- | Build a coordinate from a radian latitude and fractional longitude. Fails+-- if either are out of range.+(<㎭>) ::+ Double+ -> Double+ -> Maybe Coordinate+(<㎭>) =+ curry (^? radianCoordinate)+ +coordinatePrism ::+ Prism' Double Latitude+ -> Prism' Double Longitude+ -> Prism' (Double, Double) Coordinate+coordinatePrism f g =+ prism'+ (\x -> let (b, d) = coordinateLatLon # x+ in (f # b, g # d))+ (\(lat, lon) ->+ do lat' <- lat ^? f+ lon' <- lon ^? g+ return (Coordinate lat' lon'))++-- | A prism on the pair (below) to a coordinate:+-- +-- * a fractional latitude to a double between -90 and 90 exclusive.+--+-- * a fractional longitude to a double between -180 and 180 exclusive.+fracCoordinate ::+ Prism' (Double, Double) Coordinate+fracCoordinate =+ coordinatePrism fracLatitude fracLongitude++-- | A prism on the pair (below) to a coordinate:+-- +-- * a radian latitude to a double between -π/2 and π/2 exclusive.+--+-- * a radian longitude to a double between -π and π exclusive.+radianCoordinate ::+ Prism' (Double, Double) Coordinate+radianCoordinate =+ coordinatePrism radianLatitude radianLongitude+ coordinateLatLon :: Iso' (Latitude, Longitude) Coordinate coordinateLatLon =- iso (\(lat, lon) -> Coordinate lat lon) (\(Coordinate lat lon) -> (lat, lon))+ iso (uncurry Coordinate) (\(Coordinate lat lon) -> (lat, lon)) coordinateLonLat :: Iso' (Longitude, Latitude) Coordinate
src/Data/Geo/Coordinate/DegreesLatitude.hs view
@@ -1,12 +1,19 @@+{-# LANGUAGE NoImplicitPrelude #-}+ module Data.Geo.Coordinate.DegreesLatitude( DegreesLatitude , HasDegreesLatitude(..) , nDegreesLatitude ) where -import Prelude(Int, Bool(..), Eq, Show, Ord(..), id, (&&))-import Data.Maybe(Maybe(..))+import Control.Category(Category(id)) import Control.Lens(Prism', Lens', prism')+import Data.Bool((&&))+import Data.Eq(Eq)+import Data.Int(Int)+import Data.Maybe(Maybe(Just, Nothing))+import Data.Ord(Ord((<), (>)))+import Prelude(Show) -- $setup -- >>> import Control.Lens((#), (^?))@@ -43,9 +50,9 @@ nDegreesLatitude = prism' (\(DegreesLatitude i) -> i)- (\i -> case i > -90 && i < 90 of- True -> Just (DegreesLatitude i)- False -> Nothing)+ (\i -> if i > -90 && i < 90+ then Just (DegreesLatitude i)+ else Nothing) class HasDegreesLatitude t where degreesLatitude ::
src/Data/Geo/Coordinate/DegreesLongitude.hs view
@@ -1,12 +1,19 @@+{-# LANGUAGE NoImplicitPrelude #-}+ module Data.Geo.Coordinate.DegreesLongitude( DegreesLongitude , HasDegreesLongitude(..) , nDegreesLongitude ) where -import Prelude(Int, Bool(..), Eq, Show, Ord(..), id, (&&))-import Data.Maybe(Maybe(..))+import Control.Category(Category(id)) import Control.Lens(Prism', Lens', prism')+import Data.Bool((&&))+import Data.Eq(Eq)+import Data.Int(Int)+import Data.Maybe(Maybe(Just, Nothing))+import Data.Ord(Ord((<), (>)))+import Prelude(Show) -- $setup -- >>> import Control.Lens((#), (^?))@@ -43,9 +50,9 @@ nDegreesLongitude = prism' (\(DegreesLongitude i) -> i)- (\i -> case i > -180 && i < 180 of- True -> Just (DegreesLongitude i)- False -> Nothing)+ (\i -> if i > -180 && i < 180+ then Just (DegreesLongitude i)+ else Nothing) class HasDegreesLongitude t where degreesLongitude ::
src/Data/Geo/Coordinate/Latitude.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE NoImplicitPrelude #-}+ module Data.Geo.Coordinate.Latitude( Latitude , HasLatitude(..)@@ -6,11 +8,15 @@ , radianLatitude ) where -import Prelude(Double, Eq, Show, Ord(..), Num(..), Floating(..), Fractional(..), Bool(..), Monad(..), id, (&&), (.), properFraction, fromIntegral)+import Control.Category(Category(id, (.))) import Control.Lens(Iso', Prism', Lens', iso, prism', lens, (#), (^?))-import Data.Geo.Coordinate.DegreesLatitude-import Data.Geo.Coordinate.Minutes-import Data.Geo.Coordinate.Seconds+import Control.Monad(Monad(return))+import Data.Eq(Eq)+import Data.Geo.Coordinate.DegreesLatitude(HasDegreesLatitude(degreesLatitude), DegreesLatitude, nDegreesLatitude)+import Data.Geo.Coordinate.Minutes(HasMinutes(minutes), Minutes, nMinutes)+import Data.Geo.Coordinate.Seconds(HasSeconds(seconds), Seconds, nSeconds)+import Data.Ord(Ord((<)))+import Prelude(Double, Show, Num((+), (*), (-), abs), Floating(pi), Fractional((/)), properFraction, fromIntegral) -- $setup -- >>> import Prelude(Functor(..))
src/Data/Geo/Coordinate/Longitude.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE NoImplicitPrelude #-}+ module Data.Geo.Coordinate.Longitude( Longitude , HasLongitude(..)@@ -6,11 +8,16 @@ , radianLongitude ) where -import Prelude(Double, Eq, Show, Ord(..), Num(..), Floating(..), Fractional(..), Bool(..), Monad(..), id, (&&), (.), properFraction, fromIntegral)++import Control.Category(Category(id, (.))) import Control.Lens(Iso', Prism', Lens', iso, prism', lens, (#), (^?))-import Data.Geo.Coordinate.DegreesLongitude-import Data.Geo.Coordinate.Minutes-import Data.Geo.Coordinate.Seconds+import Control.Monad(Monad(return))+import Data.Eq(Eq)+import Data.Geo.Coordinate.DegreesLongitude(HasDegreesLongitude(degreesLongitude), DegreesLongitude, nDegreesLongitude)+import Data.Geo.Coordinate.Minutes(HasMinutes(minutes), Minutes, nMinutes)+import Data.Geo.Coordinate.Seconds(HasSeconds(seconds), Seconds, nSeconds)+import Data.Ord(Ord((<)))+import Prelude(Double, Show, Num((+), (*), (-), abs), Floating(pi), Fractional((/)), properFraction, fromIntegral) -- $setup -- >>> import Prelude(Functor(..))
src/Data/Geo/Coordinate/Minutes.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE NoImplicitPrelude #-}+ module Data.Geo.Coordinate.Minutes( Minutes , HasMinutes(..)@@ -5,10 +7,15 @@ , modMinutes ) where -import Prelude(Functor, Int, Bool(..), Eq, Show, Ord(..), (&&), id)-import Data.Maybe(Maybe(..))+import Control.Category(Category(id)) import Control.Lens(Prism', Lens', prism')+import Data.Bool((&&))+import Data.Maybe(Maybe(Just, Nothing))+import Data.Eq(Eq)+import Data.Int(Int) import Data.Fixed(mod')+import Data.Ord(Ord((>=), (<)))+import Prelude(Show) -- $setup -- >>> import Control.Lens((#), (^?))@@ -62,9 +69,9 @@ nMinutes = prism' (\(Minutes i) -> i)- (\i -> case i >= 0 && i < 60 of- True -> Just (Minutes i)- False -> Nothing)+ (\i -> if i >= 0 && i < 60+ then Just (Minutes i)+ else Nothing) class HasMinutes t where minutes ::
src/Data/Geo/Coordinate/Seconds.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE NoImplicitPrelude #-}+ module Data.Geo.Coordinate.Seconds( Seconds , HasSeconds(..)@@ -5,11 +7,16 @@ , nSeconds ) where -import Prelude(Double, Bool(..), Eq, Show(..), Ord(..), id, (&&), (++), showParen, showString)-import Data.Maybe(Maybe(..))+import Control.Category(Category(id)) import Control.Lens(Prism', Lens', prism')-import Text.Printf(printf)+import Data.Bool((&&))+import Data.Eq(Eq) import Data.Fixed(mod')+import Data.Ord(Ord((>), (>=), (<)))+import Data.Maybe(Maybe(Just, Nothing))+import Data.List((++))+import Prelude(Double, Show(showsPrec), showParen, showString)+import Text.Printf(printf) -- $setup -- >>> import Control.Lens((#), (^?))@@ -75,9 +82,9 @@ nSeconds = prism' (\(Seconds d) -> d)- (\d -> case d >= 0 && d < 60 of- True -> Just (Seconds d)- False -> Nothing)+ (\d -> if d >= 0 && d < 60+ then Just (Seconds d)+ else Nothing) class HasSeconds t where seconds ::