Compare commits
4 Commits
f8dd5a4f39
...
66f8847fbe
| Author | SHA1 | Date | |
|---|---|---|---|
| 66f8847fbe | |||
| c56eb846c2 | |||
| 9df113b477 | |||
| 39e604da2b |
@ -143,6 +143,7 @@ function App() {
|
|||||||
<Route exact path='/en/software/project/kanji-application' element={<KanjiApplication />}></Route>
|
<Route exact path='/en/software/project/kanji-application' element={<KanjiApplication />}></Route>
|
||||||
<Route exact path='/en/software/project/attachment-module' element={<AttachmentModule />}></Route>
|
<Route exact path='/en/software/project/attachment-module' element={<AttachmentModule />}></Route>
|
||||||
<Route exact path='/en/software/project/teslamaze' element={<TeslaMaze />}></Route>
|
<Route exact path='/en/software/project/teslamaze' element={<TeslaMaze />}></Route>
|
||||||
|
<Route exact path='/en/software/project/config-automation' element={<ConfigAutomation />}></Route>
|
||||||
<Route exact path='/en/software/project/embedded-internet-radio' element={<EmbeddedInternetRadio />}></Route>
|
<Route exact path='/en/software/project/embedded-internet-radio' element={<EmbeddedInternetRadio />}></Route>
|
||||||
<Route exact path='/en/software/project/windows10-cookbook' element={<Windows10Cookbook />}></Route>
|
<Route exact path='/en/software/project/windows10-cookbook' element={<Windows10Cookbook />}></Route>
|
||||||
<Route exact path='/en/software/project/ios-airports' element={<IOSAirports />}></Route>
|
<Route exact path='/en/software/project/ios-airports' element={<IOSAirports />}></Route>
|
||||||
|
|||||||
@ -48,13 +48,14 @@ const languageStrings = {
|
|||||||
// Projects
|
// Projects
|
||||||
attachment_module: 'Attachment module',
|
attachment_module: 'Attachment module',
|
||||||
boebot: 'Board of Education robot',
|
boebot: 'Board of Education robot',
|
||||||
|
config_automation: 'Configuration automation',
|
||||||
dxp_development: 'DXP development',
|
dxp_development: 'DXP development',
|
||||||
embedded_internet_radio: 'Embedded internet radio',
|
embedded_internet_radio: 'Embedded internet radio',
|
||||||
embedded_game: 'Embedded game',
|
embedded_game: 'Embedded game',
|
||||||
ios_airports: 'iOS airport',
|
ios_airports: 'iOS airport',
|
||||||
festival_simulator: 'Festival simulator',
|
festival_simulator: 'Festival simulator',
|
||||||
kanji_application: 'Kanji applicatition',
|
kanji_application: 'Kanji applicatition',
|
||||||
metroid_horizontal_shooter: 'Horizontale shooter game',
|
metroid_horizontal_shooter: 'Metroid horizontal shooter game',
|
||||||
raspberry_pi_jukebox: 'Raspberry Pi Jukebox',
|
raspberry_pi_jukebox: 'Raspberry Pi Jukebox',
|
||||||
teslamaze: 'TeslaMaze',
|
teslamaze: 'TeslaMaze',
|
||||||
wifi_prototype: 'Wi-Fi prototype board',
|
wifi_prototype: 'Wi-Fi prototype board',
|
||||||
@ -110,13 +111,14 @@ const languageStrings = {
|
|||||||
// Projects
|
// Projects
|
||||||
attachment_module: 'Attachment module',
|
attachment_module: 'Attachment module',
|
||||||
boebot: 'Board of Education robot',
|
boebot: 'Board of Education robot',
|
||||||
|
config_automation: 'Configuratie automatisering',
|
||||||
dxp_development: 'DXP development',
|
dxp_development: 'DXP development',
|
||||||
embedded_internet_radio: 'Embedded internet radio',
|
embedded_internet_radio: 'Embedded internet radio',
|
||||||
embedded_game: 'Embedded spel',
|
embedded_game: 'Embedded spel',
|
||||||
ios_airports: 'iOS luchthavens',
|
ios_airports: 'iOS luchthavens',
|
||||||
festival_simulator: 'Festival simulator',
|
festival_simulator: 'Festival simulator',
|
||||||
kanji_application: 'Kanji applicatie',
|
kanji_application: 'Kanji applicatie',
|
||||||
metroid_horizontal_shooter: 'Horizontale shooter',
|
metroid_horizontal_shooter: 'Metroid horizontale shooter spel',
|
||||||
raspberry_pi_jukebox: 'Raspberry Pi Jukebox',
|
raspberry_pi_jukebox: 'Raspberry Pi Jukebox',
|
||||||
teslamaze: 'TeslaMaze',
|
teslamaze: 'TeslaMaze',
|
||||||
wifi_prototype: 'Wi-Fi prototype board',
|
wifi_prototype: 'Wi-Fi prototype board',
|
||||||
|
|||||||
@ -56,4 +56,9 @@ Noun+とか || Verb (dictionary form)+とか
|
|||||||
#### 関係する本
|
#### 関係する本
|
||||||
|
|
||||||
* **A Dictionary of Japanese Particles**, ISBN978-4-7700-2352-0
|
* **A Dictionary of Japanese Particles**, ISBN978-4-7700-2352-0
|
||||||
* **Nihongo So-Matome N4 ぶんぽう**, ISBN978-4-86639-075-8
|
* **Nihongo So-Matome N4 ぶんぽう**, ISBN978-4-86639-075-8
|
||||||
|
|
||||||
|
###### 関係する動画
|
||||||
|
|
||||||
|
* ['Learn Japanese ~し、~し | Learn N4 Japanese grammar'](https://www.youtube.com/watch?v=XIpRgfQEevQ) by: [Learn Japanese with Moon-chan](https://www.youtube.com/@JapanesewithMoon-chan)
|
||||||
|
* ['How to use し as because and difference between し, から and ので'](https://www.youtube.com/watch?v=85ehzPo0TQ0&t=12s) by: ['Miku Real Japanese'](https://www.youtube.com/@mikurealjapanese)
|
||||||
@ -1,6 +1,6 @@
|
|||||||
# Plamo
|
# Plamo
|
||||||
|
|
||||||
Het bouwen en schilderen van plastic schaalmodellen en mecha figuren is een hobby van me. Hier is een collectie van de dingen die I heb gemaakt en gebruik.
|
Het bouwen en schilderen van plastic schaalmodellen en mecha figuren is een hobby van me. Hier is een collectie van de dingen die ik heb gemaakt en gebruik.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,8 @@ const ConfigAutomation = () => {
|
|||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<p><hr/></p>
|
||||||
|
|
||||||
<section id="list-development" className="content-section">
|
<section id="list-development" className="content-section">
|
||||||
<h2 className="text-primary">Development</h2>
|
<h2 className="text-primary">Development</h2>
|
||||||
<p>This project started as a local Python 2 script when it started, to only automate very specific settings. It later moved to USB drives and eventually to a VM on a network.</p>
|
<p>This project started as a local Python 2 script when it started, to only automate very specific settings. It later moved to USB drives and eventually to a VM on a network.</p>
|
||||||
@ -36,6 +38,8 @@ const ConfigAutomation = () => {
|
|||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<p><hr/></p>
|
||||||
|
|
||||||
<section id="list-deployment" className="content-section">
|
<section id="list-deployment" className="content-section">
|
||||||
<h2 className="text-primary">Deployment</h2>
|
<h2 className="text-primary">Deployment</h2>
|
||||||
<p>Creating the release of this software had to be done by running a batch script to create a bundled set of Python files. These files were then uploaded to the VM located in a European distribution center in the Netherlands. This VM is then used to run the software from on a local network on which all configuration laptops were connected to. A WinSCP script would then sync the contents of all VM's in distribution centres located in Singapore, United States and China in 24 hours.</p>
|
<p>Creating the release of this software had to be done by running a batch script to create a bundled set of Python files. These files were then uploaded to the VM located in a European distribution center in the Netherlands. This VM is then used to run the software from on a local network on which all configuration laptops were connected to. A WinSCP script would then sync the contents of all VM's in distribution centres located in Singapore, United States and China in 24 hours.</p>
|
||||||
@ -51,6 +55,8 @@ const ConfigAutomation = () => {
|
|||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<p><hr/></p>
|
||||||
|
|
||||||
<section id="list-feedback" className="content-section">
|
<section id="list-feedback" className="content-section">
|
||||||
<h2 className="text-primary">Feedback</h2>
|
<h2 className="text-primary">Feedback</h2>
|
||||||
<p>The application generated log files with each configuration and then upload these back to the VM after configuration was complete or halted. These logs were sorted under product name and the order number. But quite often, I found it very productive to go to the configuration area and simply talk with the technician to figure out what went wrong. Depending on the severity of the problem, it would get documented in Gitlab issues. On a weekly basis, issues would get assigned among developers.</p>
|
<p>The application generated log files with each configuration and then upload these back to the VM after configuration was complete or halted. These logs were sorted under product name and the order number. But quite often, I found it very productive to go to the configuration area and simply talk with the technician to figure out what went wrong. Depending on the severity of the problem, it would get documented in Gitlab issues. On a weekly basis, issues would get assigned among developers.</p>
|
||||||
@ -65,6 +71,8 @@ const ConfigAutomation = () => {
|
|||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<p><hr/></p>
|
||||||
|
|
||||||
<section id="list-lessons-learnt" className="content-section">
|
<section id="list-lessons-learnt" className="content-section">
|
||||||
<h2 className="text-primary">Lessons learnt</h2>
|
<h2 className="text-primary">Lessons learnt</h2>
|
||||||
<p>Being a programmer, I was mostly concerned with the software. But it requires hardware to run on. When the software does not work because of differences in the platform the software run on, what is there to do? I eventually started managing around 40 configuration laptops, using <a href="https://clonezilla.org/" target="_blank" rel="noopener noreferrer">Clonezilla</a> to create identical machines.</p>
|
<p>Being a programmer, I was mostly concerned with the software. But it requires hardware to run on. When the software does not work because of differences in the platform the software run on, what is there to do? I eventually started managing around 40 configuration laptops, using <a href="https://clonezilla.org/" target="_blank" rel="noopener noreferrer">Clonezilla</a> to create identical machines.</p>
|
||||||
|
|||||||
@ -18,6 +18,7 @@ const SoftwareMain = () => {
|
|||||||
<p>{getString('code_pages_intro')}</p>
|
<p>{getString('code_pages_intro')}</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href={'/' + language + '/software/elm/'}>Elm</a></li>
|
<li><a href={'/' + language + '/software/elm/'}>Elm</a></li>
|
||||||
|
<li><a href={'/' + language + '/software/haskell/'}>Haskell</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
@ -26,14 +27,16 @@ const SoftwareMain = () => {
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="./project/kanji-application">{getString('kanji_application')}</a></li>
|
<li><a href="./project/kanji-application">{getString('kanji_application')}</a></li>
|
||||||
<li><a href="./project/dxp-development">{getString('dxp_development')}</a></li>
|
<li><a href="./project/dxp-development">{getString('dxp_development')}</a></li>
|
||||||
<li><a href="./project/wifi-prototype">{getString('wifi_prototype')}</a></li>
|
<li><a href="./project/config-automation">{getString('config_automation')}</a></li>
|
||||||
<li><a href="./project/embedded-game">{getString('embedded_game')}</a></li>
|
<li><a href="./project/embedded-game">{getString('embedded_game')}</a></li>
|
||||||
|
<li><a href="./project/metroid-horizontal-shooter">{getString('metroid_horizontal_shooter')}</a></li>
|
||||||
<li><a href="./project/raspberry-pi-jukebox">{getString('raspberry_pi_jukebox')}</a></li>
|
<li><a href="./project/raspberry-pi-jukebox">{getString('raspberry_pi_jukebox')}</a></li>
|
||||||
<li><a href="./project/teslamaze">{getString('teslamaze')}</a></li>
|
<li><a href="./project/teslamaze">{getString('teslamaze')}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div style={{display: "inline-block"}}>
|
<div style={{display: "inline-block"}}>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li><a href="./project/wifi-prototype">{getString('wifi_prototype')}</a></li>
|
||||||
<li><a href="./project/embedded-internet-radio">{getString('embedded_internet_radio')}</a></li>
|
<li><a href="./project/embedded-internet-radio">{getString('embedded_internet_radio')}</a></li>
|
||||||
<li><a href="./project/windows10-cookbook">{getString('windows10_cookbook')}</a></li>
|
<li><a href="./project/windows10-cookbook">{getString('windows10_cookbook')}</a></li>
|
||||||
<li><a href="./project/ios-airports">{getString('ios_airports')}</a></li>
|
<li><a href="./project/ios-airports">{getString('ios_airports')}</a></li>
|
||||||
|
|||||||
16
src/Pages/Software/haskell/HaskellPage.js
Normal file
16
src/Pages/Software/haskell/HaskellPage.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Breadcrumbs from '../../../UI/Breadcrumbs'
|
||||||
|
import MarkdownPage from '../../markdownPage'
|
||||||
|
|
||||||
|
const HaskellPage = ({ mdPath }) => {
|
||||||
|
return (
|
||||||
|
<article className='main-page'>
|
||||||
|
<Breadcrumbs separator=' > ' path="software/haskell">
|
||||||
|
{['software', 'haskell']}
|
||||||
|
</Breadcrumbs>
|
||||||
|
<MarkdownPage md={mdPath} />
|
||||||
|
</article>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default HaskellPage;
|
||||||
66
src/Pages/Software/haskell/en/curried-functions.md
Normal file
66
src/Pages/Software/haskell/en/curried-functions.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
## Curried functions
|
||||||
|
|
||||||
|
A function can return another function.
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
add' :: Int -> (Int -> Int)
|
||||||
|
add' x y = x+y
|
||||||
|
```
|
||||||
|
|
||||||
|
Here, **add'** is a function that takes an **Int** for an argument and results in a function of type: **Int -> Int**.
|
||||||
|
The function definition takes an integer **x**, followed by an integer **y**, it can be [curried](https://en.wikipedia.org/wiki/Currying).
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
addThree = add' 3 -- This is now a function with type: Int -> Int
|
||||||
|
result = addThree 5 -- Evaluates to 8
|
||||||
|
```
|
||||||
|
|
||||||
|
Another example,
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
mult :: Int -> (Int -> (Int -> Int))
|
||||||
|
mult x y z = x*y*z
|
||||||
|
```
|
||||||
|
|
||||||
|
And is applied as following:
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
mult x y z
|
||||||
|
-- Means same as:
|
||||||
|
((mult x) y) z
|
||||||
|
```
|
||||||
|
|
||||||
|
When used, it is like:
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
multTwo = mult 2 -- This is now a function with type: Int -> (Int -> Int)
|
||||||
|
multTwoThree = multTwo 3 -- This is: Int -> Int
|
||||||
|
result = multTwoThree 4 -- Evaluates to 2 * 3 * 4 = 24
|
||||||
|
|
||||||
|
-- or just:
|
||||||
|
|
||||||
|
result = mult 2 3 4 -- Also evaluates to 24
|
||||||
|
```
|
||||||
|
|
||||||
|
**Partial application** is about using curried functions, applying only some arguments and getting back a new function.
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
double = mult 2 -- This is now a function with type: Int -> (Int -> Int)
|
||||||
|
|
||||||
|
result = double 3 4 -- Evaluates to 2 * 3 * 4 = 24
|
||||||
|
|
||||||
|
quadruple = double 2 -- Now quadruple :: Int -> Int
|
||||||
|
result = quadruple 3 -- Evaluates to 2 * 2 * 3 = 12
|
||||||
|
```
|
||||||
|
|
||||||
|
The arrow function **->** in Haskell types is assumed to associate from the right.
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
Int -> Int -> Int -> Int
|
||||||
|
|
||||||
|
-- is:
|
||||||
|
|
||||||
|
Int -> (Int -> (Int -> Int))
|
||||||
|
```
|
||||||
|
|
||||||
|
So, unless tuples are required, all functions in Haskell with multiple arguments are actually defined as curried functions, with a way to reduce excessive parenthesis.
|
||||||
5
src/Pages/Software/haskell/en/main.md
Normal file
5
src/Pages/Software/haskell/en/main.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
### Haskell
|
||||||
|
|
||||||
|
I am learing functional programming and Haskell, these are my notes on the language.
|
||||||
|
|
||||||
|
* [Curried Functions](./curried-functions)
|
||||||
66
src/Pages/Software/haskell/nl/curried-functions.md
Normal file
66
src/Pages/Software/haskell/nl/curried-functions.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
## Curried functions
|
||||||
|
|
||||||
|
Een functie kan een andere functie teruggeven.
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
add' :: Int -> (Int -> Int)
|
||||||
|
add' x y = x+y
|
||||||
|
```
|
||||||
|
|
||||||
|
Hier, is **add'** functie die een **Int** als argument neemt en resulteerd in een functie van het type: **Int -> Int**.
|
||||||
|
De functie definitie neemt een integer **x**, gevolgd door integer **y**, die kan worden [ge-curried](https://en.wikipedia.org/wiki/Currying).
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
addThree = add' 3 -- Dit is nu een functie met type: Int -> Int
|
||||||
|
result = addThree 5 -- Resulteerd in 8
|
||||||
|
```
|
||||||
|
|
||||||
|
Nog een voorbeeld
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
mult :: Int -> (Int -> (Int -> Int))
|
||||||
|
mult x y z = x*y*z
|
||||||
|
```
|
||||||
|
|
||||||
|
En toegepast:
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
mult x y z
|
||||||
|
-- Hetzelfde als:
|
||||||
|
((mult x) y) z
|
||||||
|
```
|
||||||
|
|
||||||
|
Als deze wordt gebruikt, kan dat zo:
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
multTwo = mult 2 -- Dit is nu een functie met type: Int -> (Int -> Int)
|
||||||
|
multTwoThree = multTwo 3 -- Dit is is: Int -> Int
|
||||||
|
result = multTwoThree 4 -- Resulteerd in: 2 * 3 * 4 = 24
|
||||||
|
|
||||||
|
-- of gewoon:
|
||||||
|
|
||||||
|
result = mult 2 3 4 -- Resulteerd ook in 24
|
||||||
|
```
|
||||||
|
|
||||||
|
**Partial application** is het gebruiken van curried functies, door enkele argumenten te geven en een functie terug te krijgen.
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
double = mult 2 -- Dit is nu een functie met type: Int -> (Int -> Int)
|
||||||
|
|
||||||
|
result = double 3 4 -- Resulteerd in: 2 * 3 * 4 = 24
|
||||||
|
|
||||||
|
quadruple = double 2 -- quadruple :: Int -> Int
|
||||||
|
result = quadruple 3 -- Resulteerd in: 2 * 2 * 3 = 12
|
||||||
|
```
|
||||||
|
|
||||||
|
De pijl **->** in Haskell types associeerd vanaf rechts.
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
Int -> Int -> Int -> Int
|
||||||
|
|
||||||
|
-- is:
|
||||||
|
|
||||||
|
Int -> (Int -> (Int -> Int))
|
||||||
|
```
|
||||||
|
|
||||||
|
Tenzij tuples nodig zijn, zijn alle functies in Haskell met meerdere argumenten eigenlijk curried functies, met een manier om de vele haakjes weg te kunnen laten.
|
||||||
5
src/Pages/Software/haskell/nl/main.md
Normal file
5
src/Pages/Software/haskell/nl/main.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
### Haskell
|
||||||
|
|
||||||
|
I ben functioneel programmeren en Haskell aan het leren, dit zijn mijn notities van deze taal.
|
||||||
|
|
||||||
|
* [Curried Functions](./curried-functions)
|
||||||
@ -5,6 +5,7 @@ import JapanesePage from './Pages/Japan/JapanesePage';
|
|||||||
import BlogPage from './Pages/Plamo/BlogPage';
|
import BlogPage from './Pages/Plamo/BlogPage';
|
||||||
import CSharpPage from './Pages/Software/csharp/CSharpPage';
|
import CSharpPage from './Pages/Software/csharp/CSharpPage';
|
||||||
import ElmPage from './Pages/Software/elm/ElmPage';
|
import ElmPage from './Pages/Software/elm/ElmPage';
|
||||||
|
import HaskellPage from './Pages/Software/haskell/HaskellPage';
|
||||||
|
|
||||||
// Japan
|
// Japan
|
||||||
export const japaneseRoutes = languages.map(lang => {
|
export const japaneseRoutes = languages.map(lang => {
|
||||||
@ -39,8 +40,9 @@ export const programmingLanguageRoutes = languages.map(lang => {
|
|||||||
// Main page.
|
// Main page.
|
||||||
const mainCSharp = <Route key={`${lang}-csharp-main`} exact path={`/${lang}/software/csharp/`} element={<CSharpPage mdPath={`Software/csharp/${lang}/main.md`} />} />
|
const mainCSharp = <Route key={`${lang}-csharp-main`} exact path={`/${lang}/software/csharp/`} element={<CSharpPage mdPath={`Software/csharp/${lang}/main.md`} />} />
|
||||||
const mainElm = <Route key={`${lang}-elm-main`} exact path={`/${lang}/software/elm/`} element={<ElmPage mdPath={`Software/elm/${lang}/main.md`} />} />
|
const mainElm = <Route key={`${lang}-elm-main`} exact path={`/${lang}/software/elm/`} element={<ElmPage mdPath={`Software/elm/${lang}/main.md`} />} />
|
||||||
|
const mainHaskell = <Route key={`${lang}-haskell-main`} exact path={`/${lang}/software/haskell/`} element={<HaskellPage mdPath={`Software/haskell/${lang}/main.md`} />} />
|
||||||
|
|
||||||
// Pages within Elm.
|
// Pages within C#.
|
||||||
let md = ['strings', 'types'];
|
let md = ['strings', 'types'];
|
||||||
const entriesCSharp = md.map(entry => {
|
const entriesCSharp = md.map(entry => {
|
||||||
const path = `/${lang}/software/csharp/${entry}`;
|
const path = `/${lang}/software/csharp/${entry}`;
|
||||||
@ -56,5 +58,13 @@ export const programmingLanguageRoutes = languages.map(lang => {
|
|||||||
return <Route key={`${lang}-${entry}`} exact path={path} element={<ElmPage mdPath={mdPath} />} />;
|
return <Route key={`${lang}-${entry}`} exact path={path} element={<ElmPage mdPath={mdPath} />} />;
|
||||||
});
|
});
|
||||||
|
|
||||||
return [mainCSharp, mainElm, ...entriesCSharp, ...entriesElm];
|
// Pages within Haskell.
|
||||||
|
md = ['curried-functions'];
|
||||||
|
const entriesHaskell = md.map(entry => {
|
||||||
|
const path = `/${lang}/software/haskell/${entry}`;
|
||||||
|
const mdPath = `Software/haskell/${lang}/${entry}.md`;
|
||||||
|
return <Route key={`${lang}-${entry}`} exact path={path} element={<HaskellPage mdPath={mdPath} />} />;
|
||||||
|
});
|
||||||
|
|
||||||
|
return [mainCSharp, mainElm, mainHaskell, ...entriesCSharp, ...entriesElm, ...entriesHaskell];
|
||||||
}).flat();
|
}).flat();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user