coordinate-0.0.4: src/Data/Geo/Coordinate/DegreesLongitude.hs
module Data.Geo.Coordinate.DegreesLongitude(
DegreesLongitude
, HasDegreesLongitude(..)
, nDegreesLongitude
) where
import Prelude(Int, Bool(..), Eq, Show, Ord(..), id, (&&))
import Data.Maybe(Maybe(..))
import Control.Lens(Prism', Lens', prism')
-- $setup
-- >>> import Control.Lens((#), (^?))
-- >>> import Data.Foldable(all)
-- >>> import Prelude(Eq(..))
newtype DegreesLongitude =
DegreesLongitude Int
deriving (Eq, Ord, Show)
-- | A prism on degrees longitude to an integer between -180 and 180 exclusive.
--
-- >>> 7 ^? nDegreesLongitude
-- Just (DegreesLongitude 7)
--
-- >>> 0 ^? nDegreesLongitude
-- Just (DegreesLongitude 0)
--
-- >>> 179 ^? nDegreesLongitude
-- Just (DegreesLongitude 179)
--
-- >>> 180 ^? nDegreesLongitude
-- Nothing
--
-- >>> (-179) ^? nDegreesLongitude
-- Just (DegreesLongitude (-179))
--
-- >>> (-180) ^? nDegreesLongitude
-- Nothing
--
-- prop> all (\m -> nDegreesLongitude # m == n) (n ^? nDegreesLongitude)
nDegreesLongitude ::
Prism' Int DegreesLongitude
nDegreesLongitude =
prism'
(\(DegreesLongitude i) -> i)
(\i -> case i > -180 && i < 180 of
True -> Just (DegreesLongitude i)
False -> Nothing)
class HasDegreesLongitude t where
degreesLongitude ::
Lens' t DegreesLongitude
instance HasDegreesLongitude DegreesLongitude where
degreesLongitude =
id