commit 2286ae1a49a35431876f855eb03bcba9628a94fc
Author: Daniel Barlow <dan@telent.net>
Date:   Wed Oct 23 23:37:29 2024 +0100

    first passing test

diff --git a/elm.json b/elm.json
new file mode 100644
index 0000000..ce2a08d
--- /dev/null
+++ b/elm.json
@@ -0,0 +1,24 @@
+{
+    "type": "application",
+    "source-directories": [
+        "src"
+    ],
+    "elm-version": "0.19.1",
+    "dependencies": {
+        "direct": {
+            "elm/browser": "1.0.2",
+            "elm/core": "1.0.5",
+            "elm/html": "1.0.0"
+        },
+        "indirect": {
+            "elm/json": "1.1.3",
+            "elm/time": "1.0.0",
+            "elm/url": "1.0.0",
+            "elm/virtual-dom": "1.0.3"
+        }
+    },
+    "test-dependencies": {
+        "direct": {},
+        "indirect": {}
+    }
+}
diff --git a/shell.nix b/shell.nix
new file mode 100644
index 0000000..a190f2c
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,13 @@
+with import <nixpkgs> {} ; 
+pkgs.mkShell {
+  packages = [
+    pkgs.caddy
+    pkgs.elmPackages.elm
+    pkgs.elmPackages.elm-format
+    pkgs.elmPackages.elm-optimize-level-2
+    pkgs.elmPackages.elm-review
+    pkgs.elmPackages.elm-test
+#    pkgs.nodejs_18
+#    pkgs.shellcheck
+  ];
+}
diff --git a/src/Main.elm b/src/Main.elm
new file mode 100644
index 0000000..9f45ef5
--- /dev/null
+++ b/src/Main.elm
@@ -0,0 +1,56 @@
+module Main exposing (..)
+
+import Browser
+import Html exposing (Html, button, div, text)
+import Html.Events exposing (onClick)
+import Track exposing (Track)
+
+-- MAIN
+
+
+main =
+  Browser.sandbox { init = init, update = update, view = view }
+
+
+
+-- MODEL
+
+
+type alias Model = Track
+
+
+init : Model
+init =
+  Track.read "hello"
+
+
+
+-- UPDATE
+
+
+type Msg
+  = Increment
+  | Decrement
+
+
+update : Msg -> Model -> Model
+update msg model =
+  case msg of
+    Increment ->
+      model
+
+    Decrement ->
+      model
+
+
+
+-- VIEW
+
+
+view : Model -> Html Msg
+view model =
+  div []
+    [ button [ onClick Decrement ] [ text "-" ]
+    , div [] [ text (String.fromInt (List.length model)) ]
+    , button [ onClick Increment ] [ text "+" ]
+    ]
diff --git a/src/Track.elm b/src/Track.elm
new file mode 100644
index 0000000..c324d6a
--- /dev/null
+++ b/src/Track.elm
@@ -0,0 +1,22 @@
+module Track exposing (Track, parse)
+
+import Result
+import Xml.Decode as XD exposing (path, single, list, float)
+
+
+type alias Point =
+    { lat : Float
+    , lon : Float
+    }
+
+type alias Track =  List Point
+
+pointDecoder = XD.map2 Point
+               (XD.path ["ele"] (single float))
+               (XD.path ["ele"] (single float))
+
+gpxDecoder =
+             (XD.path [ "trk", "trkseg", "trkpt" ] (XD.list pointDecoder))
+
+
+parse str = XD.run gpxDecoder str
diff --git a/tests/Fixtures.elm b/tests/Fixtures.elm
new file mode 100644
index 0000000..f89f843
--- /dev/null
+++ b/tests/Fixtures.elm
@@ -0,0 +1,60 @@
+module Fixtures exposing (threepoints)
+
+threepoints = """
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx
+version="1.1"
+creator="OpenTracks"
+xmlns="http://www.topografix.com/GPX/1/1"
+xmlns:topografix="http://www.topografix.com/GPX/Private/TopoGrafix/0/1"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xmlns:opentracks="http://opentracksapp.com/xmlschemas/v1"
+xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v2"
+xmlns:gpxtrkx="http://www.garmin.com/xmlschemas/TrackStatsExtension/v1"
+xmlns:cluetrust="http://www.cluetrust.com/Schemas/"
+xmlns:pwr="http://www.garmin.com/xmlschemas/PowerExtension/v1"
+xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.topografix.com/GPX/Private/TopoGrafix/0/1 http://www.topografix.com/GPX/Private/TopoGrafix/0/1/topografix.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v2 https://www8.garmin.com/xmlschemas/TrackPointExtensionv2.xsd http://www.garmin.com/xmlschemas/PowerExtension/v1 https://www8.garmin.com/xmlschemas/PowerExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackStatsExtension/v1 http://www.cluetrust.com/Schemas http://www.cluetrust.com/Schemas/gpxdata10.xsd http://opentracksapp.com/xmlschemas/v1 http://opentracksapp.com/xmlschemas/OpenTracks_v1.xsd">
+<trk>
+<name><![CDATA[2024-10-23T08:34+01]]></name>
+<desc><![CDATA[]]></desc>
+<type><![CDATA[unknown]]></type>
+<extensions>
+</extensions>
+<trkseg>
+<trkpt lat="51.600643" lon="-0.01856">
+<ele>64.8</ele>
+<time>2024-10-23T08:40:52.256+01:00</time>
+<extensions><gpxtpx:TrackPointExtension>
+<gpxtpx:speed>8.49</gpxtpx:speed>
+<gpxtpx:cad>110</gpxtpx:cad>
+<pwr:PowerInWatts>89</pwr:PowerInWatts>
+<opentracks:accuracy_horizontal>3.216</opentracks:accuracy_horizontal><opentracks:distance>17.08</opentracks:distance>
+<cluetrust:distance>1,468.88</cluetrust:distance>
+</gpxtpx:TrackPointExtension></extensions>
+</trkpt>
+<trkpt lat="51.600679" lon="-0.018179">
+<ele>65.5</ele>
+<time>2024-10-23T08:40:55.259+01:00</time>
+<extensions><gpxtpx:TrackPointExtension>
+<gpxtpx:speed>8.57</gpxtpx:speed>
+<gpxtpx:cad>111</gpxtpx:cad>
+<pwr:PowerInWatts>86</pwr:PowerInWatts>
+<opentracks:accuracy_horizontal>3.216</opentracks:accuracy_horizontal><opentracks:distance>17.08</opentracks:distance>
+<cluetrust:distance>1,485.96</cluetrust:distance>
+</gpxtpx:TrackPointExtension></extensions>
+</trkpt>
+<trkpt lat="51.600697" lon="-0.018064">
+<ele>66.2</ele>
+<time>2024-10-23T08:40:56.231+01:00</time>
+<extensions><gpxtpx:TrackPointExtension>
+<gpxtpx:speed>8.62</gpxtpx:speed>
+<gpxtpx:cad>111</gpxtpx:cad>
+<pwr:PowerInWatts>86</pwr:PowerInWatts>
+<opentracks:accuracy_horizontal>3.216</opentracks:accuracy_horizontal><opentracks:distance>10.675</opentracks:distance>
+<cluetrust:distance>1,496.635</cluetrust:distance>
+</gpxtpx:TrackPointExtension></extensions>
+</trkpt>
+</trkseg>
+</trk>
+</gpx>
+"""
diff --git a/tests/TrackTest.elm b/tests/TrackTest.elm
new file mode 100644
index 0000000..406e83f
--- /dev/null
+++ b/tests/TrackTest.elm
@@ -0,0 +1,19 @@
+module TrackTest exposing (specs)
+import Fixtures
+
+import Track exposing (Track)
+import Test exposing (..)
+import Expect exposing (Expectation)
+
+specs: Test
+specs =
+    describe "XML Parsing"
+        [ test "it runs" <|
+              \_ ->
+              let
+                  r = Track.parse Fixtures.threepoints
+              in
+                  case r of
+                      (Ok trk) -> Expect.equal (List.length trk) 3
+                      _ -> Expect.fail "not ok"
+        ]