packages feed

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 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 ::