module Fay.GeoPosition ( geoPositionErrorMessage
, geoPositionErrorCode
#ifdef FAY
, initGeoPosition
#endif
, GeoPositionCallbacks(..)
, GeoPositionOptions(..)
, GeoPosition(..)
, GeoCoordinates(..)
, GeoPositionError(..)
, GeoPositionErrorCode(..)
) where
import Fay.Text (Text,unpack)
#ifdef FAY
import FFI
import Data.Nullable (toNullable)
#endif
import Data.Time (UTCTime)
import Data.Data
import Prelude
#ifdef FAY
initGeoPosition :: GeoPositionCallbacks Fay
-> Maybe GeoPositionOptions
-> Fay ()
initGeoPosition gpc gpo = do
getCurrentPosition' gpc's gpc'e gpc'o
where getCurrentPosition' :: GeoPositionCallback Fay
-> Nullable (GeoPositionErrorCallback Fay)
-> Nullable GeoPositionOptions
-> Fay ()
getCurrentPosition' = ffi "navigator.geolocation.getCurrentPosition(%1,%2,%3)"
gpc's = geoPositionCallback gpc
gpc'e = toNullable (geoPositionErrorCallback gpc)
gpc'o = toNullable gpo
#endif
data GeoPositionCallbacks m = GeoPositionCallbacks { geoPositionCallback :: GeoPositionCallback m
, geoPositionErrorCallback :: Maybe (GeoPositionErrorCallback m)
}
type GeoPositionCallback m = GeoPosition -> m ()
type GeoPositionErrorCallback m = GeoPositionError -> m ()
data GeoPositionOptions =
GeoPositionOptions {
enableHighAccuracy :: Bool
, timeout :: Int
, maximumAge :: Int
} deriving Eq
data GeoPosition = GeoPosition { coords :: GeoCoordinates
, timestamp :: UTCTime
} deriving (Show,Data,Typeable)
data GeoCoordinates = GeoCoordinates { latitude :: Double
, longitude :: Double
, altitude :: Maybe Double
, accuracy :: Double
, altitudeAccuracy :: Maybe Double
, heading :: Maybe Double
, speed :: Maybe Double
} deriving (Read,Show,Data,Typeable)
data GeoPositionError = GeoPositionError { code :: Int
, message :: Text
} deriving (Read,Show,Data,Typeable)
data GeoPositionErrorCode
= PermissionDenied
| PositionUnavailable
| Timeout
| Unknown
deriving (Eq)
geoPositionErrorMessage :: GeoPositionError -> String
geoPositionErrorMessage = unpack . message
geoPositionErrorCode :: GeoPositionError -> GeoPositionErrorCode
geoPositionErrorCode = decode . code
where decode e | e == 1 = PermissionDenied
| e == 2 = PositionUnavailable
| e == 3 = Timeout
| otherwise = Unknown