> A ReScript variant type to represent async data
npm install rescript-asyncdata> A ReScript variant type to represent async data
Run the following in your console:
``console`
$ yarn add rescript-asyncdata
Then add rescript-asyncdata to your bsconfig.json's bs-dependencies:
`diff`
{
"bs-dependencies": [
+ "rescript-asyncdata"
]
}
AsyncData provides a variant type that helps you represent the state of an async request. The type consists of three tags:
- NotAsked: the request hasn't started yetLoading
- : the request has been initialised and we're waiting for a responseDone('a)
- : the request has finished with 'a
ReScript provides a result<'ok, 'error> type to represent an operation success.
You can combine AsyncData.t and result to represent a possible request failure state:
`reason`
type userFromServer = AsyncData.t
> Note that you can use your own error type in place of exn
Then, you can pattern match:
`reason`
switch userFromServer {
| NotAsked => React.null
| Loading =>
| Done(Error(error)) =>
| Done(Ok(user)) =>
}
You can combine multiple AsyncData.t to represent more complex loading styles:
`reason
type reloadableUserFromServer = {
userFromServer: userFromServer,
userFromServerReload: userFromServer,
}
let initialState = {
userFromServer: NotAsked,
userFromServerReload: NotAsked
}
let firstLoad = {
userFromServer: Loading,
userFromServerReload: NotAsked
}
let firstLoadDone = {
userFromServer: Done(Ok(user)),
userFromServerReload: NotAsked
}
let reload = {
userFromServer: Done(Ok(user)),
userFromServerReload: Loading
}
// If you just want to replace the previous state
let reloadDone = {
userFromServer: Done(Ok(newUser)),
userFromServerReload: NotAsked
}
// If you want to compare/show a diff
let reloadDone = {
userFromServer: Done(Ok(user)),
userFromServerReload: Done(Ok(newUser))
}
`
This package contains a few utility functions to manipulate AsyncData.t:
- getExn: Extract the Done('a) payload or throwgetWithDefault
- : Extract the Done('a) payload or return a default valuemapWithDefault
- : Extract and map the Done('a) payload or return a default valuemap
- : Map the Done('a) payloadflatMap
- : Map the Done('a) payload with a callback that returns a AsyncData.tisLoading
- isNotAsked
- isDone
- cmp
- : For sortingeq`: For comparison
-
This is heavily inspired by Elm's krisajenkins/remotedata