Add Elm Maybe.andThen page.
This commit is contained in:
parent
0f7016f68d
commit
bba3acb191
@ -1,5 +1,6 @@
|
|||||||
### Elm
|
### Elm
|
||||||
|
|
||||||
* [Formatting](./formatting)
|
* [Formatting](./formatting)
|
||||||
|
* [Maybe.andThen](./maybeandthen)
|
||||||
* [Maybe.map](./maybemap)
|
* [Maybe.map](./maybemap)
|
||||||
* [Don't Repeat Yourself](./dry)
|
* [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
|
### Elm
|
||||||
|
|
||||||
* [Formatting](./formatting)
|
* [Formatting](./formatting)
|
||||||
|
* [Maybe.andThen](./maybeandthen)
|
||||||
* [Maybe.map](./maybemap)
|
* [Maybe.map](./maybemap)
|
||||||
* [Don't Repeat Yourself](./dry)
|
* [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`} />} />
|
const main = <Route key={`${lang}-elm-main`} exact path={`/${lang}/software/elm/`} element={<ElmPage mdPath={`Software/elm/${lang}/main.md`} />} />
|
||||||
|
|
||||||
// Pages within Elm.
|
// Pages within Elm.
|
||||||
const md = ['formatting', 'maybemap', 'dry'];
|
const md = ['dry', 'formatting', 'maybeandthen', 'maybemap'];
|
||||||
const entries = md.map(entry => {
|
const entries = md.map(entry => {
|
||||||
const path = `/${lang}/software/elm/${entry}`;
|
const path = `/${lang}/software/elm/${entry}`;
|
||||||
const mdPath = `Software/elm/${lang}/${entry}.md`;
|
const mdPath = `Software/elm/${lang}/${entry}.md`;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user