module Track exposing (Track, Point, parse) import Result import Xml.Decode as XD exposing (path, list, single, floatAttr, stringAttr) import Time import Iso8601 type alias Point = { lat : Float , lon : Float , ele : Float , time : Time.Posix } type alias Track = List Point timeDecoder : XD.Decoder Time.Posix timeDecoder = XD.andThen (\ts -> case Iso8601.toTime ts of Result.Ok time -> XD.succeed time Result.Err f -> XD.fail "err" ) XD.string pointDecoder = XD.map4 Point (floatAttr "lat") (floatAttr "lon") (path ["ele"] (single XD.float)) (path ["time"] (single timeDecoder)) gpxDecoder = (path [ "trk", "trkseg", "trkpt" ] (list pointDecoder)) parse str = XD.run gpxDecoder str