Add Elm Maybe.andThen page.
This commit is contained in:
parent
0f7016f68d
commit
bba3acb191
@ -1,5 +1,6 @@
|
||||
### Elm
|
||||
|
||||
* [Formatting](./formatting)
|
||||
* [Maybe.andThen](./maybeandthen)
|
||||
* [Maybe.map](./maybemap)
|
||||
* [Don't Repeat Yourself](./dry)
|
||||
89
src/Pages/Software/elm/en/maybeandthen.md
Normal file
89
src/Pages/Software/elm/en/maybeandthen.md
Normal 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
|
||||
```
|
||||
@ -1,5 +1,6 @@
|
||||
### Elm
|
||||
|
||||
* [Formatting](./formatting)
|
||||
* [Maybe.andThen](./maybeandthen)
|
||||
* [Maybe.map](./maybemap)
|
||||
* [Don't Repeat Yourself](./dry)
|
||||
89
src/Pages/Software/elm/nl/maybeandthen.md
Normal file
89
src/Pages/Software/elm/nl/maybeandthen.md
Normal 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
|
||||
```
|
||||
@ -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`;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user