rescript-asyncdata
v4.0.0
Published
> A ReScript variant type to represent async data
Downloads
334
Readme
AsyncData
A ReScript variant type to represent async data
Installation
Run the following in your console:
$ yarn add rescript-asyncdata
Then add rescript-asyncdata
to your bsconfig.json
's bs-dependencies
:
{
"bs-dependencies": [
+ "rescript-asyncdata"
]
}
Basics
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
Representing success & failure states
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:
type userFromServer = AsyncData.t<result<User.t, exn>>
Note that you can use your own error type in place of
exn
Then, you can pattern match:
switch userFromServer {
| NotAsked => React.null
| Loading => <LoadingIndicator />
| Done(Error(error)) => <ErrorIndicator error />
| Done(Ok(user)) => <UserCard user />
}
Representing reload
You can combine multiple AsyncData.t
to represent more complex loading styles:
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))
}
Utility functions
This package contains a few utility functions to manipulate AsyncData.t
:
getExn
: Extract theDone('a)
payload or throwgetWithDefault
: Extract theDone('a)
payload or return a default valuemapWithDefault
: Extract and map theDone('a)
payload or return a default valuemap
: Map theDone('a)
payloadflatMap
: Map theDone('a)
payload with a callback that returns aAsyncData.t
isLoading
isNotAsked
isDone
cmp
: For sortingeq
: For comparison
Aknowledgments
This is heavily inspired by Elm's krisajenkins/remotedata