diff --git a/src/state/Async.ts b/src/state/Async.ts
index 79de4140..61871f78 100644
--- a/src/state/Async.ts
+++ b/src/state/Async.ts
@@ -7,8 +7,12 @@ Please see LICENSE in the repository root for full details.
import { catchError, from, map, type Observable, of, startWith } from "rxjs";
-// TODO where are all the comments? ::cry::
-// There used to be an unitialized state!, a state might not start in loading
+/**
+ * Data that may need to be loaded asynchronously.
+ *
+ * This type is for when you need to represent the current state of an operation
+ * involving Promises as **immutable data**. See the async$ function below.
+ */
export type Async =
| { state: "loading" }
| { state: "error"; value: Error }
@@ -23,6 +27,11 @@ export function ready(value: A): Async {
return { state: "ready", value };
}
+/**
+ * Turn a Promise into an Observable async value. The Observable will have the
+ * value "loading" while the Promise is pending, "ready" when the Promise
+ * resolves, and "error" when the Promise rejects.
+ */
export function async$(promise: Promise): Observable> {
return from(promise).pipe(
map(ready),
@@ -33,6 +42,9 @@ export function async$(promise: Promise): Observable> {
);
}
+/**
+ * If the async value is ready, apply the given function to the inner value.
+ */
export function mapAsync(
async: Async,
project: (value: A) => B,