From cc6d143dd8124e13059c26125e70237795e9a9a4 Mon Sep 17 00:00:00 2001 From: Jakub Hampl Date: Fri, 13 Jul 2018 15:20:50 +0100 Subject: Clean up various messes --- src/LngLat.elm | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/LngLat.elm (limited to 'src/LngLat.elm') 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 } -- cgit v1.2.3