From f8c8aa04224f3a8dc6886cc08acf53a0ab74375a Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 12:41:02 -0400
Subject: [PATCH 01/12] (style) Format Picker.elm

---
 src/Picker.elm | 145 ++++++++++++++++++++++++++-----------------------
 1 file changed, 78 insertions(+), 67 deletions(-)

diff --git a/src/Picker.elm b/src/Picker.elm
index 15db129da..707c418a5 100644
--- a/src/Picker.elm
+++ b/src/Picker.elm
@@ -6,14 +6,13 @@ import Html.Attributes exposing (..)
 import Html.Events exposing (..)
 
 
-
 main =
-  App.programWithFlags
-    { init = init
-    , view = view
-    , update = update
-    , subscriptions = subscriptions
-    }
+    App.programWithFlags
+        { init = init
+        , view = view
+        , update = update
+        , subscriptions = subscriptions
+        }
 
 
 
@@ -21,32 +20,32 @@ main =
 
 
 type alias Model =
-  { running : Bool
-  , entries : List Entry
-  }
+    { running : Bool
+    , entries : List Entry
+    }
 
 
 type alias Entry =
-  { selected : Bool
-  , id : Int
-  , impl : Impl
-  }
+    { selected : Bool
+    , id : Int
+    , impl : Impl
+    }
 
 
 type alias Impl =
-  { name : String
-  , version : String
-  , url : String
-  , optimized : Bool
-  }
+    { name : String
+    , version : String
+    , url : String
+    , optimized : Bool
+    }
 
 
 init : List Impl -> ( Model, Cmd msg )
 init impls =
-  { running = False
-  , entries = List.indexedMap (Entry False) impls
-  }
-    ! []
+    { running = False
+    , entries = List.indexedMap (Entry False) impls
+    }
+        ! []
 
 
 
@@ -54,39 +53,38 @@ init impls =
 
 
 type Msg
-  = Toggle Int
-  | Start
-  | End
+    = Toggle Int
+    | Start
+    | End
 
 
 update : Msg -> Model -> ( Model, Cmd msg )
 update msg model =
-  case msg of
-    Toggle id ->
-      { model | entries = toggle id model.entries }
-        ! []
+    case msg of
+        Toggle id ->
+            { model | entries = toggle id model.entries }
+                ! []
 
-    Start ->
-      { model | running = True }
-        ! [ startSelected model.entries ]
+        Start ->
+            { model | running = True }
+                ! [ startSelected model.entries ]
 
-    End ->
-      { model | running = False }
-        ! []
+        End ->
+            { model | running = False }
+                ! []
 
 
 toggle : Int -> List Entry -> List Entry
 toggle id entries =
-  case entries of
-    [] ->
-      []
+    case entries of
+        [] ->
+            []
 
-    entry :: rest ->
-      if entry.id == id then
-        { entry | selected = not entry.selected } :: rest
-
-      else
-        entry :: toggle id rest
+        entry :: rest ->
+            if entry.id == id then
+                { entry | selected = not entry.selected } :: rest
+            else
+                entry :: toggle id rest
 
 
 port start : List Impl -> Cmd msg
@@ -94,7 +92,7 @@ port start : List Impl -> Cmd msg
 
 startSelected : List Entry -> Cmd msg
 startSelected entries =
-  start (List.map .impl (List.filter .selected entries))
+    start (List.map .impl (List.filter .selected entries))
 
 
 
@@ -106,7 +104,7 @@ port end : (() -> msg) -> Sub msg
 
 subscriptions : Model -> Sub Msg
 subscriptions model =
-  end (always End)
+    end (always End)
 
 
 
@@ -115,33 +113,46 @@ subscriptions model =
 
 view : Model -> Html Msg
 view { running, entries } =
-  div []
-    [ ul
-        (if running then [ style [("color", "#aaa")] ] else [])
-        (List.map (viewEntry running) entries)
-    , button
-        [ style [("width","100%")]
-        , disabled running
-        , onClick Start
+    div []
+        [ ul
+            (if running then
+                [ style [ ( "color", "#aaa" ) ] ]
+             else
+                []
+            )
+            (List.map (viewEntry running) entries)
+        , button
+            [ style [ ( "width", "100%" ) ]
+            , disabled running
+            , onClick Start
+            ]
+            [ text "Run" ]
         ]
-        [ text "Run" ]
-    ]
 
 
 viewEntry : Bool -> Entry -> Html Msg
 viewEntry running { id, selected, impl } =
-  li
-    (if running then [ pointer ] else [ pointer, onClick (Toggle id) ])
-    [ input [ type' "checkbox", checked selected, disabled running ] []
-    , text (" " ++ impl.name ++ " " ++ impl.version)
-    , span
-        [ style [("color","#aaa")]
-        ]
-        [ text (if impl.optimized then " (optimized)" else "")
+    li
+        (if running then
+            [ pointer ]
+         else
+            [ pointer, onClick (Toggle id) ]
+        )
+        [ input [ type' "checkbox", checked selected, disabled running ] []
+        , text (" " ++ impl.name ++ " " ++ impl.version)
+        , span
+            [ style [ ( "color", "#aaa" ) ]
+            ]
+            [ text
+                (if impl.optimized then
+                    " (optimized)"
+                 else
+                    ""
+                )
+            ]
         ]
-    ]
 
 
 pointer : Attribute msg
 pointer =
-  style [ ("cursor", "pointer") ]
\ No newline at end of file
+    style [ ( "cursor", "pointer" ) ]

From d694590afd69962a0b00c5ce515bab101ee5f5ef Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:23:06 -0400
Subject: [PATCH 02/12] Pass in afterBlogPost flag per impl to Elm

---
 index.html | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/index.html b/index.html
index a5a6fec8e..9f9e7b3ac 100644
--- a/index.html
+++ b/index.html
@@ -28,29 +28,30 @@ <h3>Methodology Notes</h3>
   </div>
 
   <script type="text/javascript">
-    function impl(name, version, optimized, url)
+    function impl(name, version, optimized, url, afterBlogPost)
     {
       return {
         name: name,
         version: version,
         optimized: optimized,
-        url: 'implementations/' + url
+        url: 'implementations/' + url,
+        afterBlogPost: afterBlogPost
       };
     }
 
     var div = document.getElementById('sidebar');
     var picker = Elm.Picker.embed(div, [
-      impl('Ember', '2.6.3', false, 'ember-2.6.3/dist/index.html'),
-      impl('React', '15.3.1', false, 'react-15.3.1/index.html'),
-      impl('Angular', '1.5.8', false, 'angular-1.5.8/index.html'),
-      impl('Angular', '2', false, 'angular-2/index.html'),
-      impl('Elm', '0.16', false, 'elm-0.16/index.html'),
-      impl('Elm', '0.17', false, 'elm-0.17/index.html'),
-      impl('React', '15.3.1', true, 'react-15.3.1-optimized/index.html'),
-      impl('Angular', '1.5.8', true, 'angular-1.5.8-optimized/index.html'),
-      impl('Angular', '2', true, 'angular-2-optimized/index.html'),
-      impl('Elm', '0.16', true, 'elm-0.16-optimized/index.html'),
-      impl('Elm', '0.17', true, 'elm-0.17-optimized/index.html')
+      impl('Ember', '2.6.3', false, 'ember-2.6.3/dist/index.html', false),
+      impl('React', '15.3.1', false, 'react-15.3.1/index.html', false),
+      impl('Angular', '1.5.8', false, 'angular-1.5.8/index.html', false),
+      impl('Angular', '2', false, 'angular-2/index.html', false),
+      impl('Elm', '0.16', false, 'elm-0.16/index.html', false),
+      impl('Elm', '0.17', false, 'elm-0.17/index.html', false),
+      impl('React', '15.3.1', true, 'react-15.3.1-optimized/index.html', false),
+      impl('Angular', '1.5.8', true, 'angular-1.5.8-optimized/index.html', false),
+      impl('Angular', '2', true, 'angular-2-optimized/index.html', false),
+      impl('Elm', '0.16', true, 'elm-0.16-optimized/index.html', false),
+      impl('Elm', '0.17', true, 'elm-0.17-optimized/index.html', false)
     ]);
 
     picker.ports.start.subscribe(function(impls) {

From a00db1e51a980637d6d7b2645c8555365a59c741 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:23:43 -0400
Subject: [PATCH 03/12] Receive afterBlogPost flag in Elm

---
 src/Picker.elm | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/Picker.elm b/src/Picker.elm
index 707c418a5..2c62dc0fe 100644
--- a/src/Picker.elm
+++ b/src/Picker.elm
@@ -37,6 +37,7 @@ type alias Impl =
     , version : String
     , url : String
     , optimized : Bool
+    , afterBlogPost : Bool
     }
 
 

From d5981387bca8ed3e60091859dbe9ed3cab49e2e6 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:25:23 -0400
Subject: [PATCH 04/12] Display before/after entries separately on ui

---
 src/Picker.elm | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/Picker.elm b/src/Picker.elm
index 2c62dc0fe..1c97a461e 100644
--- a/src/Picker.elm
+++ b/src/Picker.elm
@@ -115,13 +115,29 @@ subscriptions model =
 view : Model -> Html Msg
 view { running, entries } =
     div []
-        [ ul
+        [ h2 [] [ text "Before Blog Post" ]
+        , ul
             (if running then
                 [ style [ ( "color", "#aaa" ) ] ]
              else
                 []
             )
-            (List.map (viewEntry running) entries)
+            (entries
+                |> List.filter (\entry -> not entry.impl.afterBlogPost)
+                |> List.map (viewEntry running)
+            )
+        , hr [] []
+        , h2 [] [ text "After Blog Post" ]
+        , ul
+            (if running then
+                [ style [ ( "color", "#aaa" ) ] ]
+             else
+                []
+            )
+            (entries
+                |> List.filter (\entry -> entry.impl.afterBlogPost)
+                |> List.map (viewEntry running)
+            )
         , button
             [ style [ ( "width", "100%" ) ]
             , disabled running

From c1d3d97fc3e090dcfabcf16f1e52778688b29973 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:25:54 -0400
Subject: [PATCH 05/12] (style) Make some existing code cleaner

---
 src/Picker.elm | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/Picker.elm b/src/Picker.elm
index 1c97a461e..179190287 100644
--- a/src/Picker.elm
+++ b/src/Picker.elm
@@ -49,7 +49,6 @@ init impls =
         ! []
 
 
-
 -- UPDATE
 
 
@@ -93,7 +92,10 @@ port start : List Impl -> Cmd msg
 
 startSelected : List Entry -> Cmd msg
 startSelected entries =
-    start (List.map .impl (List.filter .selected entries))
+    entries
+        |> List.filter .selected
+        |> List.map .impl
+        |> start
 
 
 

From c7ccb131fcf9f91ad9535f1e0bc087f09521e37d Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:40:43 -0400
Subject: [PATCH 06/12] More clearly distinguish early/late entries in view

---
 src/Picker.elm | 62 ++++++++++++++++++++++++++------------------------
 1 file changed, 32 insertions(+), 30 deletions(-)

diff --git a/src/Picker.elm b/src/Picker.elm
index 179190287..a7f816fd1 100644
--- a/src/Picker.elm
+++ b/src/Picker.elm
@@ -49,6 +49,7 @@ init impls =
         ! []
 
 
+
 -- UPDATE
 
 
@@ -116,37 +117,38 @@ subscriptions model =
 
 view : Model -> Html Msg
 view { running, entries } =
-    div []
-        [ h2 [] [ text "Before Blog Post" ]
-        , ul
-            (if running then
-                [ style [ ( "color", "#aaa" ) ] ]
-             else
-                []
-            )
-            (entries
-                |> List.filter (\entry -> not entry.impl.afterBlogPost)
-                |> List.map (viewEntry running)
-            )
-        , hr [] []
-        , h2 [] [ text "After Blog Post" ]
-        , ul
-            (if running then
-                [ style [ ( "color", "#aaa" ) ] ]
-             else
-                []
-            )
-            (entries
-                |> List.filter (\entry -> entry.impl.afterBlogPost)
-                |> List.map (viewEntry running)
-            )
-        , button
-            [ style [ ( "width", "100%" ) ]
-            , disabled running
-            , onClick Start
+    let
+        earlyEntries =
+            entries |> List.filter (\entry -> not entry.impl.afterBlogPost)
+
+        laterEntries =
+            entries |> List.filter (\entry -> entry.impl.afterBlogPost)
+    in
+        div []
+            [ h2 [] [ text "Before Blog Post" ]
+            , ul
+                (if running then
+                    [ style [ ( "color", "#aaa" ) ] ]
+                 else
+                    []
+                )
+                (List.map (viewEntry running) earlyEntries)
+            , hr [] []
+            , h2 [] [ text "After Blog Post" ]
+            , ul
+                (if running then
+                    [ style [ ( "color", "#aaa" ) ] ]
+                 else
+                    []
+                )
+                (List.map (viewEntry running) laterEntries)
+            , button
+                [ style [ ( "width", "100%" ) ]
+                , disabled running
+                , onClick Start
+                ]
+                [ text "Run" ]
             ]
-            [ text "Run" ]
-        ]
 
 
 viewEntry : Bool -> Entry -> Html Msg

From 1954454744b3c5ee08aec9947e68a6951502890a Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:42:55 -0400
Subject: [PATCH 07/12] Include pkgjson to use Elm0.17 over global elm

---
 src/package.json | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 src/package.json

diff --git a/src/package.json b/src/package.json
new file mode 100644
index 000000000..7f2c33d49
--- /dev/null
+++ b/src/package.json
@@ -0,0 +1,14 @@
+{
+  "name": "src",
+  "version": "1.0.0",
+  "description": "",
+  "main": "add-complete-delete-batched.js",
+  "scripts": {
+    "make": "npx elm make Picker.elm --output=picker.js"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "elm": "^0.17.1"
+  }
+}

From 1cc8a6d9297066d5cd83b05d77d8c335ed052078 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:43:34 -0400
Subject: [PATCH 08/12] README instruction for development setup

---
 readme.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/readme.md b/readme.md
index f9865cd4b..4c114e856 100644
--- a/readme.md
+++ b/readme.md
@@ -69,7 +69,9 @@ If you want to fork this repo and try things out, the easiest way is probably to
 
 ```bash
 cd src
-elm-make Picker.elm --output=picker.js
+npm install
+# Uses Elm 0.18 instead of global package:
+npm run make
 ```
 
 And then navigate into `implementations/*/readme.md` and follow the build instructions for the various projects.

From f789017c34597cbb1873f4a3e95f17384c0612f5 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:44:00 -0400
Subject: [PATCH 09/12] Add Note in index about old/new entry difference

---
 index.html | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/index.html b/index.html
index 9f9e7b3ac..7d675a80c 100644
--- a/index.html
+++ b/index.html
@@ -25,6 +25,8 @@ <h3>Methodology Notes</h3>
     </p>
     <p>Check out <a href="http://elm-lang.org/blog/blazing-fast-html-round-two">this blog post</a> for more information on the methodology we used to make these comparisons as fair as possible.
     </p>
+    <h4>Note</h4>
+    <p>Some frameworks or versions listed to the right have been added subsequent to the blog post being posted, allowing future implementations to be compared with newer versions of Elm.</p>
   </div>
 
   <script type="text/javascript">

From 7430c9b63dd62ba2d027113ff79cf8679072ea14 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:44:38 -0400
Subject: [PATCH 10/12] Ignore pkg-lock and picker.js from git

---
 .gitignore | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 074a1ba79..5e012db72 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 elm-stuff
-node_modules
\ No newline at end of file
+node_modules
+picker.js
+package-lock.json

From 3162d2a25aa69585a5b8c6ada13967ad6a830d21 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sat, 25 Aug 2018 14:53:04 -0400
Subject: [PATCH 11/12] Hide laterEntries section if none provided

---
 src/Picker.elm | 42 ++++++++++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/src/Picker.elm b/src/Picker.elm
index a7f816fd1..236bf919f 100644
--- a/src/Picker.elm
+++ b/src/Picker.elm
@@ -124,7 +124,7 @@ view { running, entries } =
         laterEntries =
             entries |> List.filter (\entry -> entry.impl.afterBlogPost)
     in
-        div []
+        div [] <|
             [ h2 [] [ text "Before Blog Post" ]
             , ul
                 (if running then
@@ -133,22 +133,32 @@ view { running, entries } =
                     []
                 )
                 (List.map (viewEntry running) earlyEntries)
-            , hr [] []
-            , h2 [] [ text "After Blog Post" ]
-            , ul
-                (if running then
-                    [ style [ ( "color", "#aaa" ) ] ]
-                 else
-                    []
-                )
-                (List.map (viewEntry running) laterEntries)
-            , button
-                [ style [ ( "width", "100%" ) ]
-                , disabled running
-                , onClick Start
-                ]
-                [ text "Run" ]
             ]
+                ++ (viewLaterEntries running laterEntries)
+                ++ [ button
+                        [ style [ ( "width", "100%" ) ]
+                        , disabled running
+                        , onClick Start
+                        ]
+                        [ text "Run" ]
+                   ]
+
+
+viewLaterEntries : Bool -> List Entry -> List (Html Msg)
+viewLaterEntries running entries =
+    if List.isEmpty entries then
+        []
+    else
+        [ hr [] []
+        , h2 [] [ text "After Blog Post" ]
+        , ul
+            (if running then
+                [ style [ ( "color", "#aaa" ) ] ]
+             else
+                []
+            )
+            (List.map (viewEntry running) entries)
+        ]
 
 
 viewEntry : Bool -> Entry -> Html Msg

From 49450e8067a6161c6e003c532932164dba6006b1 Mon Sep 17 00:00:00 2001
From: timbuckley <timothypbuckley@gmail.com>
Date: Sun, 26 Aug 2018 10:19:52 -0400
Subject: [PATCH 12/12] Split up view{Early|Later}Entries

---
 src/Picker.elm | 69 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 41 insertions(+), 28 deletions(-)

diff --git a/src/Picker.elm b/src/Picker.elm
index 236bf919f..6d980afe5 100644
--- a/src/Picker.elm
+++ b/src/Picker.elm
@@ -117,6 +117,20 @@ subscriptions model =
 
 view : Model -> Html Msg
 view { running, entries } =
+    div [] <|
+        (viewEarlyEntries running entries)
+            ++ (viewLaterEntries running entries)
+            ++ [ button
+                    [ style [ ( "width", "100%" ) ]
+                    , disabled running
+                    , onClick Start
+                    ]
+                    [ text "Run" ]
+               ]
+
+
+viewEarlyEntries : Bool -> List Entry -> List (Html Msg)
+viewEarlyEntries running entries =
     let
         earlyEntries =
             entries |> List.filter (\entry -> not entry.impl.afterBlogPost)
@@ -124,41 +138,40 @@ view { running, entries } =
         laterEntries =
             entries |> List.filter (\entry -> entry.impl.afterBlogPost)
     in
-        div [] <|
-            [ h2 [] [ text "Before Blog Post" ]
+        (if List.isEmpty laterEntries then
+            []
+         else
+            [ h2 [] [ text "Before Blog Post" ] ]
+        )
+            ++ [ ul
+                    (if running then
+                        [ style [ ( "color", "#aaa" ) ] ]
+                     else
+                        []
+                    )
+                    (List.map (viewEntry running) earlyEntries)
+               ]
+
+
+viewLaterEntries : Bool -> List Entry -> List (Html Msg)
+viewLaterEntries running entries =
+    let
+        laterEntries =
+            entries |> List.filter (\entry -> entry.impl.afterBlogPost)
+    in
+        if List.isEmpty laterEntries then
+            []
+        else
+            [ hr [] []
+            , h2 [] [ text "After Blog Post" ]
             , ul
                 (if running then
                     [ style [ ( "color", "#aaa" ) ] ]
                  else
                     []
                 )
-                (List.map (viewEntry running) earlyEntries)
+                (List.map (viewEntry running) laterEntries)
             ]
-                ++ (viewLaterEntries running laterEntries)
-                ++ [ button
-                        [ style [ ( "width", "100%" ) ]
-                        , disabled running
-                        , onClick Start
-                        ]
-                        [ text "Run" ]
-                   ]
-
-
-viewLaterEntries : Bool -> List Entry -> List (Html Msg)
-viewLaterEntries running entries =
-    if List.isEmpty entries then
-        []
-    else
-        [ hr [] []
-        , h2 [] [ text "After Blog Post" ]
-        , ul
-            (if running then
-                [ style [ ( "color", "#aaa" ) ] ]
-             else
-                []
-            )
-            (List.map (viewEntry running) entries)
-        ]
 
 
 viewEntry : Bool -> Entry -> Html Msg