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