1
0

Add Elm Maybe.andThen page.

This commit is contained in:
PA4KEV 2024-07-01 00:49:44 +02:00
parent 0f7016f68d
commit bba3acb191
5 changed files with 181 additions and 1 deletions

View File

@ -1,5 +1,6 @@
### Elm
* [Formatting](./formatting)
* [Maybe.andThen](./maybeandthen)
* [Maybe.map](./maybemap)
* [Don't Repeat Yourself](./dry)

View File

@ -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
```

View File

@ -1,5 +1,6 @@
### Elm
* [Formatting](./formatting)
* [Maybe.andThen](./maybeandthen)
* [Maybe.map](./maybemap)
* [Don't Repeat Yourself](./dry)

View File

@ -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
```

View File

@ -8,7 +8,7 @@ export const elmRoutes = languages.map(lang => {
const main = <Route key={`${lang}-elm-main`} exact path={`/${lang}/software/elm/`} element={<ElmPage mdPath={`Software/elm/${lang}/main.md`} />} />
// 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`;