coordinate 0.0.6 → 0.0.7
raw patch · 4 files changed
+70/−3 lines, 4 files
Files
- coordinate.cabal +1/−1
- src/Data/Geo/Coordinate/Coordinate.hs +16/−2
- src/Data/Geo/Coordinate/Minutes.hs +25/−0
- src/Data/Geo/Coordinate/Seconds.hs +28/−0
coordinate.cabal view
@@ -1,5 +1,5 @@ name: coordinate-version: 0.0.6+version: 0.0.7 license: BSD3 license-File: etc/LICENCE author: Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
src/Data/Geo/Coordinate/Coordinate.hs view
@@ -1,6 +1,7 @@ module Data.Geo.Coordinate.Coordinate( Coordinate , (.#.)+, (..#..) , HasCoordinate(..) , coordinateLatLon , coordinateLonLat@@ -9,8 +10,9 @@ , coordinateDMSLatDMSLon ) where -import Prelude(Eq, Show, Ord, id, (.))-import Control.Lens(Iso', Lens', iso, lens, mapping, swapped, withIso)+import Prelude(Eq, Show, Ord, Double, id, return, (.))+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@@ -24,12 +26,24 @@ Longitude deriving (Eq, Ord, Show) +-- | Build a coordinate from a latitude and longitude. (.#.) :: Latitude -> Longitude -> Coordinate (.#.) = Coordinate++-- | 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') coordinateLatLon :: Iso' (Latitude, Longitude) Coordinate
src/Data/Geo/Coordinate/Minutes.hs view
@@ -2,11 +2,13 @@ Minutes , HasMinutes(..) , nMinutes+, modMinutes ) where import Prelude(Functor, Int, Bool(..), Eq, Show, Ord(..), (&&), id) import Data.Maybe(Maybe(..)) import Control.Lens(Prism', Lens', prism')+import Data.Fixed(mod') -- $setup -- >>> import Control.Lens((#), (^?))@@ -16,6 +18,29 @@ newtype Minutes = Minutes Int deriving (Eq, Ord, Show)++-- | Construct minutes such that if the given value is out of bounds,+-- a modulus is taken to keep it within 0 inclusive and 59 inclusive.+--+-- >>> modMinutes 7+-- Minutes 7+--+-- >>> modMinutes 0+-- Minutes 0+--+-- >>> modMinutes 60+-- Minutes 0+--+-- >>> modMinutes 61+-- Minutes 1+--+-- >>> modMinutes 59+-- Minutes 59+modMinutes ::+ Int+ -> Minutes+modMinutes x =+ Minutes (x `mod'` 60) -- | A prism on minutes to an integer between 0 and 59 inclusive. --
src/Data/Geo/Coordinate/Seconds.hs view
@@ -1,6 +1,7 @@ module Data.Geo.Coordinate.Seconds( Seconds , HasSeconds(..)+, modSeconds , nSeconds ) where @@ -8,6 +9,7 @@ import Data.Maybe(Maybe(..)) import Control.Lens(Prism', Lens', prism') import Text.Printf(printf)+import Data.Fixed(mod') -- $setup -- >>> import Control.Lens((#), (^?))@@ -23,6 +25,32 @@ instance Show Seconds where showsPrec n (Seconds d) = showParen (n > 10) (showString ("Seconds " ++ printf "%0.4f" d))++-- | Construct seconds such that if the given value is out of bounds,+-- a modulus is taken to keep it within 0 inclusive and 60 exclusive.+--+-- >>> modSeconds 7+-- Seconds 7.0000+--+-- >>> modSeconds 0+-- Seconds 0.0000+--+-- >>> modSeconds (-0.0001)+-- Seconds 59.9999+--+-- >>> modSeconds 60+-- Seconds 0.0000+--+-- >>> modSeconds 59.99999+-- Seconds 60.0000+--+-- >>> modSeconds 59.999+-- Seconds 59.9990+modSeconds ::+ Double+ -> Seconds+modSeconds x =+ Seconds (x `mod'` 60) -- | A prism on seconds to a double between 0 inclusive and 60 exclusive. --