diff --git a/src/Pages/Software/elm/en/main.md b/src/Pages/Software/elm/en/main.md index fd536a5..9559435 100644 --- a/src/Pages/Software/elm/en/main.md +++ b/src/Pages/Software/elm/en/main.md @@ -1,5 +1,6 @@ ### Elm * [Formatting](./formatting) +* [Maybe.andThen](./maybeandthen) * [Maybe.map](./maybemap) * [Don't Repeat Yourself](./dry) \ No newline at end of file diff --git a/src/Pages/Software/elm/en/maybeandthen.md b/src/Pages/Software/elm/en/maybeandthen.md new file mode 100644 index 0000000..efb6829 --- /dev/null +++ b/src/Pages/Software/elm/en/maybeandthen.md @@ -0,0 +1,89 @@ +Elm - Maybe AndThen +=================== + +Given are these functions, **hasPrecedingReleasedVersions** and **getSelectedItemIndex**, need to be optimized. + + +```elm + +hasPrecedingReleasedVersions = + case getSelectedItemIndex data.versionData of + Just index -> + Array.slice 0 index data.versionData.allItems + |> Array.toList + |> List.any + (\item -> + case item of + ReleasedVersion _ -> + True + _ -> + False + ) + Nothing -> + False +``` + +Currently, **getSelectedItemIndex** is defined as such: + +```elm + +getSelectedItemIndex : Model id -> Maybe Int +getSelectedItemIndex model = + case getSelectedItem model of + Just selected -> + Array.toIndexedList model.allItems + |> List.filter (\( _, item ) -> item == selected) + |> List.head + |> Maybe.map Tuple.first + + Nothing -> + Nothing + + +``` + +But using [Maybe.andThen](https://package.elm-lang.org/packages/elm/core/latest/Maybe#andThen) will allow to get rid of the **Nothing -> Nothing** here. +Also the **List.filter** and **List.head** combination can be shortened with a **List.find**. + +```elm + +getSelectedItemIndex : Model id -> Maybe Int +getSelectedItemIndex model = + getSelectedItem model + |> Maybe.andThen + (\selected -> + Array.toIndexedList model.allItems + |> List.find (\( _, item ) -> item == selected) + |> Maybe.map Tuple.first + ) + + +``` + +Finally, define a custom funcion to determine the boolean: + +```elm + +itemIsReleased : VersionData id -> Bool +itemIsReleased versionData = + case versionData of + WorkingVersion _ -> + False + ReleasedVersion + True + +``` + +The original function can now be changed to: + +```elm + +hasPrecedingReleasedVersions = + case getSelectedItemIndex data.versionData of + Just index -> + Array.slice 0 index data.versionData.allItems + |> Array.toList + |> List.any itemIsReleased + Nothing -> + False +``` \ No newline at end of file diff --git a/src/Pages/Software/elm/nl/main.md b/src/Pages/Software/elm/nl/main.md index fd536a5..9559435 100644 --- a/src/Pages/Software/elm/nl/main.md +++ b/src/Pages/Software/elm/nl/main.md @@ -1,5 +1,6 @@ ### Elm * [Formatting](./formatting) +* [Maybe.andThen](./maybeandthen) * [Maybe.map](./maybemap) * [Don't Repeat Yourself](./dry) \ No newline at end of file diff --git a/src/Pages/Software/elm/nl/maybeandthen.md b/src/Pages/Software/elm/nl/maybeandthen.md new file mode 100644 index 0000000..267c38b --- /dev/null +++ b/src/Pages/Software/elm/nl/maybeandthen.md @@ -0,0 +1,89 @@ +Elm - Maybe AndThen +=================== + +Gegeven zijn deze functies: **hasPrecedingReleasedVersions** en **getSelectedItemIndex**. Deze moeten aangepast worden. + + +```elm + +hasPrecedingReleasedVersions = + case getSelectedItemIndex data.versionData of + Just index -> + Array.slice 0 index data.versionData.allItems + |> Array.toList + |> List.any + (\item -> + case item of + ReleasedVersion _ -> + True + _ -> + False + ) + Nothing -> + False +``` + +Momenteel is **getSelectedItemIndex** zo gedefineerd: + +```elm + +getSelectedItemIndex : Model id -> Maybe Int +getSelectedItemIndex model = + case getSelectedItem model of + Just selected -> + Array.toIndexedList model.allItems + |> List.filter (\( _, item ) -> item == selected) + |> List.head + |> Maybe.map Tuple.first + + Nothing -> + Nothing + + +``` + +Door een [Maybe.andThen](https://package.elm-lang.org/packages/elm/core/latest/Maybe#andThen) te gebruiken, kunnen we de **Nothing -> Nothing** weglaten. +Ook de **List.filter** en **List.head** combinatie kan verkort werden met een **List.find**. + +```elm + +getSelectedItemIndex : Model id -> Maybe Int +getSelectedItemIndex model = + getSelectedItem model + |> Maybe.andThen + (\selected -> + Array.toIndexedList model.allItems + |> List.find (\( _, item ) -> item == selected) + |> Maybe.map Tuple.first + ) + + +``` + +Ten slotte, defineer een nieuwe functie om de boolean te achterhalen: + +```elm + +itemIsReleased : VersionData id -> Bool +itemIsReleased versionData = + case versionData of + WorkingVersion _ -> + False + ReleasedVersion + True + +``` + +De originele functie kan nu veranderd worden naar: + +```elm + +hasPrecedingReleasedVersions = + case getSelectedItemIndex data.versionData of + Just index -> + Array.slice 0 index data.versionData.allItems + |> Array.toList + |> List.any itemIsReleased + Nothing -> + False +``` \ No newline at end of file diff --git a/src/Routers.js b/src/Routers.js index e3fc4ae..b4bad27 100644 --- a/src/Routers.js +++ b/src/Routers.js @@ -8,7 +8,7 @@ export const elmRoutes = languages.map(lang => { const main = } /> // Pages within Elm. - const md = ['formatting', 'maybemap', 'dry']; + const md = ['dry', 'formatting', 'maybeandthen', 'maybemap']; const entries = md.map(entry => { const path = `/${lang}/software/elm/${entry}`; const mdPath = `Software/elm/${lang}/${entry}.md`;