aboutsummaryrefslogtreecommitdiffstats
path: root/src/LngLat.elm
diff options
context:
space:
mode:
Diffstat (limited to 'src/LngLat.elm')
-rw-r--r--src/LngLat.elm58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/LngLat.elm b/src/LngLat.elm
new file mode 100644
index 0000000..896dc73
--- /dev/null
+++ b/src/LngLat.elm
@@ -0,0 +1,58 @@
+module LngLat exposing (LngLat, encodeAsPair, encodeAsObject, decodeFromPair, decodeFromObject, map)
+
+{-| @docs LngLat, encodeAsPair, encodeAsObject, decodeFromPair, decodeFromObject, map
+-}
+
+import Json.Encode as Encode exposing (Value)
+import Json.Decode as Decode exposing (Decoder)
+
+
+{-| A LngLat represents a geographic position.
+-}
+type alias LngLat =
+ { lng : Float
+ , lat : Float
+ }
+
+
+{-| Most implementations seem to encode these as a 2 member array.
+-}
+encodeAsPair : LngLat -> Value
+encodeAsPair { lng, lat } =
+ Encode.list [ Encode.float lng, Encode.float lat ]
+
+
+{-| Most implementations seem to encode these as a 2 member array.
+-}
+decodeFromPair : Decoder LngLat
+decodeFromPair =
+ Decode.list Decode.float
+ |> Decode.andThen
+ (\l ->
+ case l of
+ [ lng, lat ] ->
+ Decode.succeed (LngLat lng lat)
+
+ _ ->
+ Decode.fail "Doesn't apear to be a valid lng lat pair"
+ )
+
+
+{-| We can also encode as an `{lng: 32, lat: 435}` object.
+-}
+encodeAsObject : LngLat -> Value
+encodeAsObject { lng, lat } =
+ Encode.object [ ( "lng", Encode.float lng ), ( "lat", Encode.float lat ) ]
+
+
+{-| We can also encode from an `{lng: 32, lat: 435}` object.
+-}
+decodeFromObject : Decoder LngLat
+decodeFromObject =
+ Decode.map2 LngLat (Decode.field "lng" Decode.float) (Decode.field "lat" Decode.float)
+
+
+{-| -}
+map : (Float -> Float) -> LngLat -> LngLat
+map f { lng, lat } =
+ { lng = f lng, lat = f lat }