diff --git a/readme.md b/readme.md
index d7ba7a1..ee75626 100644
--- a/readme.md
+++ b/readme.md
@@ -1,7 +1,80 @@
# thunderstrike.ai intern resources
## purescript
-**Purescript** is a strongly-typed[type safety] purely functional programming language
+**Purescript** is a strongly-typed [type safety]
+purely functional [purely functional]
+programming language that compiles to javascript (like typescript).
-```purescript
+### In brief
+
+ -
+ effectful code
+ [side effect]
+ is isolated from non-effectful code. This makes programs much more consistent to run and reason about.
+
+ - everything is an expression
+ - interacting with raw javascript is relatively painless
+
+
+### 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.
+
+**React**
+```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
+ ? ({error.message}
)
+ : items === undefined
+ ? (Loading...
)
+ : items.map(item => {
+ return (
+
+
{item.title}
+
{item.description}
+
+ )
+ })
+}
+```
+
+**Halogen**
+```haskell
+type Item = {id :: String, title :: String, description :: String}
+data State = StateEmpty | StateErrored Error | StateGotItems (Array Item)
+data Action = Init
+
+renderItem item = div [] [ p [] [text item.title]
+ , span [className "small"] [text item.description]
+ ]
+
+renderApp StateEmpty = p [] [text "Loading..."]
+renderApp (StateErrored e) = p [className "error"] [text (message e)]
+renderApp (StateGotItems items) = map renderItem items
+
+action Init = do
+ 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
+ , eval: mkEval (defaultEval {handleAction = action, initialize: Just Init})
+ }
```