packages feed

reverse-geocoding 0.1.0.2 → 0.1.1.0

raw patch · 2 files changed

+19/−4 lines, 2 files

Files

reverse-geocoding.cabal view
@@ -1,5 +1,5 @@ name:                reverse-geocoding-version:             0.1.0.2+version:             0.1.1.0 synopsis:            Simple reverse geocoding using OpenStreeMap description:         Simple reverse geocoding using OpenStreeMap homepage:            https://github.com/jcristovao/reverse-geocoding
src/Data/Geolocation/Reverse/Providers.hs view
@@ -9,16 +9,18 @@   ( ReverseGeoJsonKey   , ReverseGeoParser   , ReverseGeoProvider--  , openStreetMap+  , openStreetMap -- ^ Only one supported right now    ) where  import Control.Applicative +import Data.Char import Data.Monoid+import Data.Maybe import Data.Aeson import Data.Aeson.Types+import Control.Monad (join) import qualified Data.Text as T  import Data.Geolocation.Reverse.Types@@ -43,9 +45,22 @@          <> "&lon=" <> show lon  +getPostCodeText :: Suburb -> Maybe Suburb+getPostCodeText (Suburb txt) = let+  rest = T.dropWhile (\c -> isDigit c || isSpace c || (c == '-')) txt+  in if T.null rest then Nothing else Just (Suburb rest)++(<||>) :: Parser (Maybe a) -> Parser (Maybe a) -> Parser (Maybe a)+pa <||> pb = do+  a <- pa+  if isJust a then pa else pb++-- Not all records have suburb defined, but some have it written in the post code+-- This function tries to extract if from the post code if available.+openStreetMapParser :: Object -> Parser ParsedLocationInfo openStreetMapParser o =   ParsedLocationInfo <$> o .:  "country_code"                      <*> o .:  "city"-                     <*> o .:? "suburb"+                     <*> ((o .:? "suburb") <||> fmap (join . fmap getPostCodeText) ( o .:? "postcode"))                      <*> ((o .:? "road") <|> (o .:? "street"))                      <*> o .:? "postcode"