intern-resources/readme.md

109 lines
2.7 KiB
Markdown
Raw Normal View History

2023-10-06 23:13:31 +00:00
# thunderstrike.ai intern resources
## purescript
2023-10-06 23:35:07 +00:00
**Purescript** is a strongly-typed <a href="https://en.wikipedia.org/wiki/Type_safety"><sup>[type safety]</sup></a>
purely functional <a href="https://en.wikipedia.org/wiki/Purely_functional_programming"><sup>[purely functional]</sup></a>
programming language that compiles to javascript (like typescript).
2023-10-06 23:13:31 +00:00
2023-10-06 23:35:07 +00:00
### In brief
<ul>
<li>
effectful code
<a href="https://en.wikipedia.org/wiki/Side_effect_(computer_science)"><sup>[side effect]</sup></a>
is isolated from non-effectful code. This makes programs much more consistent to run and reason about.
</li>
<li>everything is an expression</li>
<li>interacting with raw javascript is relatively painless</li>
</ul>
### Motivating example: React vs Halogen
this frontend app:
1. renders `"Loading..."` until either data or error
1. fetches data from a server
1. if ok, render items in a list. if error, render error span at the bottom of the page.
2023-10-06 23:37:34 +00:00
<table>
2023-10-06 23:38:40 +00:00
<thead>
<td><b>React</b></td>
<td><b>Halogen</b></td>
<thead>
<tbody>
<tr>
<td>
2023-10-06 23:37:34 +00:00
2023-10-06 23:35:07 +00:00
```javascript
export const App = () => {
const [items, setItems] = React.useState(undefined)
const [error, setError] = React.useState(undefined)
React.useEffect(() => {
fetch('/api/item')
.then(rep => rep.json())
.then(items => setItems(items))
.catch(e => setError(e))
}, [])
return error !== undefined
? (<p class="error">{error.message}</p>)
: items === undefined
? (<p>Loading...</p>)
: items.map(item => {
return (
<div key={item.id}>
<p>{item.title}</p>
2023-10-06 23:39:25 +00:00
<span class="small">
{item.description}
</span>
2023-10-06 23:35:07 +00:00
</div>
)
})
}
```
2023-10-06 23:37:49 +00:00
</td>
<td>
2023-10-06 23:37:34 +00:00
2023-10-06 23:35:07 +00:00
```haskell
type Item = {id :: String, title :: String, description :: String}
2023-10-06 23:40:38 +00:00
data State
= StateEmpty
| StateErrored Error
| StateGotItems (Array Item)
2023-10-06 23:35:07 +00:00
2023-10-06 23:40:38 +00:00
data Action = ActionInit
renderItem item =
div [] [ p [] [text item.title]
, span
[className "small"]
[text item.description]
]
2023-10-06 23:35:07 +00:00
renderApp StateEmpty = p [] [text "Loading..."]
renderApp (StateErrored e) = p [className "error"] [text (message e)]
renderApp (StateGotItems items) = map renderItem items
2023-10-06 23:40:38 +00:00
action ActionInit = do
2023-10-06 23:35:07 +00:00
response <- fetch (URL "/api/item") {method: Get}
jsonString <- text response
itemsOrError <- readJSON jsonString
case itemsOrError of
Right items -> put (StateGotItems items)
Left error -> put (StateErrored error)
app = mkComponent
{ initialState: StateEmpty
, render: renderApp
2023-10-06 23:40:38 +00:00
, eval:
mkEval ( defaultEval { handleAction = action
, initialize: Just ActionInit
}
)
2023-10-06 23:35:07 +00:00
}
2023-10-06 23:13:31 +00:00
```
2023-10-06 23:37:34 +00:00
2023-10-06 23:38:40 +00:00
</td>
</tr>
</tbody>
2023-10-06 23:37:34 +00:00
</table>