You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asyncband.apache.org by ti...@apache.org on 2026/09/11 14:04:29 UTC
(asyncband-site) branch main updated: chore: format Markdown with dprint (#14)
This is an automated email from the ASF dual-hosted git repository.
tisonkun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/asyncband-site.git
The following commit(s) were added to refs/heads/main by this push:
new e34caf4 chore: format Markdown with dprint (#14)
e34caf4 is described below
commit e34caf46f9e46f5967788c0954c3163eda245f21
Author: tison <wa...@gmail.com>
AuthorDate: Fri Sep 11 22:04:25 2026 +0800
chore: format Markdown with dprint (#14)
---
.dprint.json | 11 +++
.oxfmtrc.json | 2 +-
AGENTS.md | 16 ++---
README.md | 2 +
package.json | 6 +-
pnpm-lock.yaml | 162 +++++++++++++++++++++++++++++++++++++++++++++
pnpm-workspace.yaml | 1 +
src/pages/_home-content.md | 46 ++++++-------
src/pages/downloads.md | 8 +--
9 files changed, 216 insertions(+), 38 deletions(-)
diff --git a/.dprint.json b/.dprint.json
new file mode 100644
index 0000000..8d3d341
--- /dev/null
+++ b/.dprint.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://dprint.dev/schemas/v0.json",
+ "markdown": {
+ "textWrap": "never",
+ "list.unorderedMarker": "asterisks",
+ "table.skipFormat": false
+ },
+ "includes": ["**/*.md"],
+ "excludes": ["**/node_modules", "static/**", "build/**", ".docusaurus/**"],
+ "plugins": ["./node_modules/@dprint/markdown/plugin.wasm"]
+}
diff --git a/.oxfmtrc.json b/.oxfmtrc.json
index b469725..4ac6b42 100644
--- a/.oxfmtrc.json
+++ b/.oxfmtrc.json
@@ -5,5 +5,5 @@
"trailingComma": "none",
"printWidth": 100,
"proseWrap": "never",
- "ignorePatterns": ["pnpm-lock.yaml", "static/**", "build/**", ".docusaurus/**"]
+ "ignorePatterns": ["**/*.md", "pnpm-lock.yaml", "static/**", "build/**", ".docusaurus/**"]
}
diff --git a/AGENTS.md b/AGENTS.md
index 33fb596..b290c4b 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -2,11 +2,11 @@
## Pull Request Preview Workflow
-- Fetch `origin/main` and create every pull request branch from its latest commit.
-- Name the source branch `preview/<name>`, where `<name>` uses lowercase letters, digits, and hyphens. Do not use `codex/`, `staging/`, or `site/` for a pull request branch.
-- Run `pnpm validate` before pushing the branch.
-- Push the `preview/<name>` branch before opening the pull request. The deploy workflow publishes its build to the generated `site/<name>-staging` branch and ASF serves it at `https://asyncband-<name>.staged.apache.org/`.
-- Treat `site/<name>-staging` as deployment output. Never base work on it, commit to it directly, or use it as the pull request head branch.
-- Open the pull request from `preview/<name>` into `main` and include the staging URL in the pull request description.
-- When the pull request is closed, the cleanup workflow deletes the `site/<name>-staging` branch so deployment output does not accumulate. The staged preview may remain reachable until ASF infrastructure prunes it. To remove a stale staging branch by hand, delete its `site/<name>-staging` branch.
-- Production publishing remains separate: pushes to `main` publish through the `asf-site` branch.
+* Fetch `origin/main` and create every pull request branch from its latest commit.
+* Name the source branch `preview/<name>`, where `<name>` uses lowercase letters, digits, and hyphens. Do not use `codex/`, `staging/`, or `site/` for a pull request branch.
+* Run `pnpm validate` before pushing the branch.
+* Push the `preview/<name>` branch before opening the pull request. The deploy workflow publishes its build to the generated `site/<name>-staging` branch and ASF serves it at `https://asyncband-<name>.staged.apache.org/`.
+* Treat `site/<name>-staging` as deployment output. Never base work on it, commit to it directly, or use it as the pull request head branch.
+* Open the pull request from `preview/<name>` into `main` and include the staging URL in the pull request description.
+* When the pull request is closed, the cleanup workflow deletes the `site/<name>-staging` branch so deployment output does not accumulate. The staged preview may remain reachable until ASF infrastructure prunes it. To remove a stale staging branch by hand, delete its `site/<name>-staging` branch.
+* Production publishing remains separate: pushes to `main` publish through the `asf-site` branch.
diff --git a/README.md b/README.md
index 85e8c79..55ecf8e 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,8 @@ Pages live under `src/pages/`. The homepage is `src/pages/index.tsx`, with its p
Fenced `bash` and `rust` code blocks are highlighted during the build. Docusaurus also supports MDX components when a page needs behavior beyond Markdown.
+Run `pnpm format` to format the repository.
+
## Validating
Run the type, formatting, lint, and production-build checks:
diff --git a/package.json b/package.json
index 99b30e4..2dc0cdc 100644
--- a/package.json
+++ b/package.json
@@ -14,8 +14,8 @@
"build": "docusaurus build",
"preview": "docusaurus serve",
"check": "tsc",
- "lint": "oxlint --deny-warnings && oxfmt --check .",
- "format": "oxfmt .",
+ "lint": "oxlint --deny-warnings && oxfmt --check . && dprint check",
+ "format": "oxfmt . && dprint fmt",
"validate": "pnpm check && pnpm lint && pnpm build"
},
"dependencies": {
@@ -29,7 +29,9 @@
"@docusaurus/module-type-aliases": "^3.10.2",
"@docusaurus/tsconfig": "^3.10.2",
"@docusaurus/types": "^3.10.2",
+ "@dprint/markdown": "^0.23.3",
"@types/node": "^24",
+ "dprint": "^0.57.4",
"oxfmt": "^0.64.0",
"oxlint": "^1.79.0",
"typescript": "~5.9.3"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 87ada03..4f07fd2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -134,9 +134,15 @@ importers:
'@docusaurus/types':
specifier: ^3.10.2
version: 3.10.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)
+ '@dprint/markdown':
+ specifier: ^0.23.3
+ version: 0.23.3
'@types/node':
specifier: ^24
version: 24.13.3
+ dprint:
+ specifier: ^0.57.4
+ version: 0.57.4
oxfmt:
specifier: ^0.64.0
version: 0.64.0(svelte@5.56.10)
@@ -1328,6 +1334,93 @@ packages:
resolution: {integrity: sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==}
engines: {node: '>=20.0'}
+ '@dprint/android-arm64@0.57.4':
+ resolution: {integrity: sha512-vpafWVSNbB5ShCThZC3O5xOPsdxc2oeLedFVCsscSRf/iR6WZ62ROU2AGcxsJyE2y4/vxivejenbNYjWxL24sQ==}
+ cpu: [arm64]
+ os: [android]
+
+ '@dprint/android-x64@0.57.4':
+ resolution: {integrity: sha512-Zv2I12Zs9IK8yv1wdXGWluUram9h8Acy3NuF/7WzsxIfdlmnWzUGxoc4Z0dno6aJpv0ViXybkIHPvDKrQnvxVA==}
+ cpu: [x64]
+ os: [android]
+
+ '@dprint/darwin-arm64@0.57.4':
+ resolution: {integrity: sha512-2V1BzlP+5aLxMaq77MUn2EdRX+UtOq34QjyMwpq1wQkR5MAT2cglJro4Eh1tsI+btjt3FMsX4/PLvz6eUSLl3g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@dprint/darwin-x64@0.57.4':
+ resolution: {integrity: sha512-dQfzBLBQro1O+CxIkIVc9LJqgYsWCKXTf+3QA0Gq/NjW6KPBwlbiCquew3UOeWwGEvarNSA0/Rvz5J8HnykTPA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@dprint/linux-arm64-glibc@0.57.4':
+ resolution: {integrity: sha512-zFCgx2E2szEnMgtBCKiI/G5vV5mi7rnTVDMB2FrIa6JheqF8pgfrx6m3HWzIed74cFM3/KCH0LmIfCNZT5vRfw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@dprint/linux-arm64-musl@0.57.4':
+ resolution: {integrity: sha512-8DV33dU5c5vp/TJJp4Dy/4HYc4r5KidlMJgoiG0S9JMygVGjhrXRNiI/C7M9hLgsamqeLYt4MWfEGKvtgOwoew==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@dprint/linux-loong64-glibc@0.57.4':
+ resolution: {integrity: sha512-166HbqGPMiKjCUuaiG6xyKrw8EKFF6vPBcmwFWUYHpZE6ipVVxt1Zen9957FXoxqyA5aspmK72eQGm72dQI2Yg==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@dprint/linux-loong64-musl@0.57.4':
+ resolution: {integrity: sha512-TTNKhwDj4qCWSiP20pdktb/mF0MfjVnXEcCXAd37ll6lx+ri4M5aQKyeyFL1pVGU9msjQv++UTU7MGF9uKfOzA==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [musl]
+
+ '@dprint/linux-ppc64-glibc@0.57.4':
+ resolution: {integrity: sha512-kQGTaEoZIk+aHtEltz+nBQ54dhJ3dSxN4jxBOnK2wYCTaMkRnGxfF9Uwc29u/BL3Fw6ieDOJCSHy2VWFZdyctA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@dprint/linux-ppc64-musl@0.57.4':
+ resolution: {integrity: sha512-NuhwpDFzyBovfpI3M47eBUju8eCxR7tfrMpPBWXyl9YgX0JeBZt6clOV/fwJ2P3DE/ARD9xoyQSGgHzDoSFlOQ==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [musl]
+
+ '@dprint/linux-riscv64-glibc@0.57.4':
+ resolution: {integrity: sha512-pWBdHK8SKt9IGldbuZGbec37RyQqP4zqsWfpq7iyH+m33f7Aagus5ktvKF85KYfLTewIg+ev3vlxryB9iHBiNA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@dprint/linux-x64-glibc@0.57.4':
+ resolution: {integrity: sha512-BYrSdjYo+nfUgXqgIbZZQnHvpM6UP7Dipfsuzxs0JmuHZRRkJIPjDdj/Qpbn/5Qv1gC4eV0cZsxRu8B634wkig==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@dprint/linux-x64-musl@0.57.4':
+ resolution: {integrity: sha512-pBRF5Kfv59FLtWYWWKpDLOv2+uTIr/XG2oMuRBiXXZom0b506aMm3zKCZ7z5ELeIYutPpASfkDbHcsyTY0ky6w==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@dprint/markdown@0.23.3':
+ resolution: {integrity: sha512-llL0a6tjViXG8OIgyibfJZxW4vN3KsfoTPOl/LobFjCmdiunopoIxlDrjTR/PWHt9WJRd98m+TMfp4bb2Vc6vQ==}
+
+ '@dprint/win32-arm64@0.57.4':
+ resolution: {integrity: sha512-bGEtcSjl6T4xjwr9nUF5kgd3174NP7yb338+Ulqq5DMYcSN4ibI62eVQKBTuyLWByz56aVOL06dj8pKTUzn+yQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@dprint/win32-x64@0.57.4':
+ resolution: {integrity: sha512-P91JJG2sDvK+SvZHdqjKygy7fYABbMH1KYop+WCowyjZUin09977qltdXwJ1vb77Cbi2OD0GWUuAlqO0PjNmaw==}
+ cpu: [x64]
+ os: [win32]
+
'@hapi/hoek@9.3.0':
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
@@ -2844,6 +2937,10 @@ packages:
resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
engines: {node: '>=10'}
+ dprint@0.57.4:
+ resolution: {integrity: sha512-iiorgfJrrV7DDf7S9AB/d5ZB59Jn5idMDQoU7o6H9m6AvGVaLAPrGTAslmTwykkft9CYbWzqUrKjmKT80KWmAA==}
+ hasBin: true
+
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
@@ -7731,6 +7828,53 @@ snapshots:
- uglify-js
- webpack-cli
+ '@dprint/android-arm64@0.57.4':
+ optional: true
+
+ '@dprint/android-x64@0.57.4':
+ optional: true
+
+ '@dprint/darwin-arm64@0.57.4':
+ optional: true
+
+ '@dprint/darwin-x64@0.57.4':
+ optional: true
+
+ '@dprint/linux-arm64-glibc@0.57.4':
+ optional: true
+
+ '@dprint/linux-arm64-musl@0.57.4':
+ optional: true
+
+ '@dprint/linux-loong64-glibc@0.57.4':
+ optional: true
+
+ '@dprint/linux-loong64-musl@0.57.4':
+ optional: true
+
+ '@dprint/linux-ppc64-glibc@0.57.4':
+ optional: true
+
+ '@dprint/linux-ppc64-musl@0.57.4':
+ optional: true
+
+ '@dprint/linux-riscv64-glibc@0.57.4':
+ optional: true
+
+ '@dprint/linux-x64-glibc@0.57.4':
+ optional: true
+
+ '@dprint/linux-x64-musl@0.57.4':
+ optional: true
+
+ '@dprint/markdown@0.23.3': {}
+
+ '@dprint/win32-arm64@0.57.4':
+ optional: true
+
+ '@dprint/win32-x64@0.57.4':
+ optional: true
+
'@hapi/hoek@9.3.0': {}
'@hapi/topo@5.1.0':
@@ -9315,6 +9459,24 @@ snapshots:
dependencies:
is-obj: 2.0.0
+ dprint@0.57.4:
+ optionalDependencies:
+ '@dprint/android-arm64': 0.57.4
+ '@dprint/android-x64': 0.57.4
+ '@dprint/darwin-arm64': 0.57.4
+ '@dprint/darwin-x64': 0.57.4
+ '@dprint/linux-arm64-glibc': 0.57.4
+ '@dprint/linux-arm64-musl': 0.57.4
+ '@dprint/linux-loong64-glibc': 0.57.4
+ '@dprint/linux-loong64-musl': 0.57.4
+ '@dprint/linux-ppc64-glibc': 0.57.4
+ '@dprint/linux-ppc64-musl': 0.57.4
+ '@dprint/linux-riscv64-glibc': 0.57.4
+ '@dprint/linux-x64-glibc': 0.57.4
+ '@dprint/linux-x64-musl': 0.57.4
+ '@dprint/win32-arm64': 0.57.4
+ '@dprint/win32-x64': 0.57.4
+
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 10ed64a..bd0c63f 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,2 +1,3 @@
allowBuilds:
core-js: false
+ dprint: true
diff --git a/src/pages/_home-content.md b/src/pages/_home-content.md
index 55458ee..ef40c41 100644
--- a/src/pages/_home-content.md
+++ b/src/pages/_home-content.md
@@ -32,29 +32,29 @@ Public paths stay direct while Cargo features keep unused implementations out of
## API map
-| Area | API | Feature | Use |
-| --- | --- | --- | --- |
-| Locks and conditions | [`Mutex`](https://docs.rs/asyncband/*/asyncband/mutex/struct.Mutex.html) | `mutex` | Protect shared data with asynchronous mutual exclusion. |
-| | [`RwLock`](https://docs.rs/asyncband/*/asyncband/rwlock/struct.RwLock.html) | `rwlock` | Allow multiple readers or one writer. |
-| | [`Condvar`](https://docs.rs/asyncband/*/asyncband/condvar/struct.Condvar.html) | `condvar` | Wait for notifications while releasing a mutex. |
-| Coordination | [`Semaphore`](https://docs.rs/asyncband/*/asyncband/semaphore/struct.Semaphore.html) | `semaphore` | Limit concurrent work by acquiring permits. |
-| | [`Barrier`](https://docs.rs/asyncband/*/asyncband/barrier/struct.Barrier.html) | `barrier` | Synchronize a fixed number of participants at a reusable rendezvous. |
-| | [`ManualResetEvent`](https://docs.rs/asyncband/*/asyncband/event/struct.ManualResetEvent.html) | `event` | Signal current and future waits until explicitly reset. |
-| | [`Latch`](https://docs.rs/asyncband/*/asyncband/latch/struct.Latch.html) | `latch` | Wait until a fixed one-way countdown reaches zero. |
-| | [`WaitGroup`](https://docs.rs/asyncband/*/asyncband/waitgroup/struct.WaitGroup.html) | `waitgroup` | Dynamically register participants and wait until all have completed. |
-| | [`Shutdown`](https://docs.rs/asyncband/*/asyncband/shutdown/struct.Shutdown.html) | `shutdown` | Request shutdown and wait until all completion guards are dropped. |
-| Work coalescing | [`Once`](https://docs.rs/asyncband/*/asyncband/once/struct.Once.html) | `once` | Complete one asynchronous initialization; cancelled or panicked attempts may be retried. |
-| | [`OnceCell`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceCell.html) | `once-cell` | Store one value from an access-time initializer; failed, cancelled, or panicked attempts may be retried. |
-| | [`LazyCell`](https://docs.rs/asyncband/*/asyncband/once/struct.LazyCell.html) | `lazy-cell` | Initialize one value with a stored function and resume the same in-flight future after caller cancellation. |
-| | [`OnceMap`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceMap.html) | `once-map` | Coalesce work per key and retain each successful value until explicitly removed. |
-| | [`Group`](https://docs.rs/asyncband/*/asyncband/singleflight/struct.Group.html) | `singleflight` | Coalesce overlapping work per key without retaining completed values. |
-| Communication | [`Completion`](https://docs.rs/asyncband/*/asyncband/completion/struct.Completion.html) | `completion` | Publish one shared result to any number of current and future observers. |
-| | [`oneshot`](https://docs.rs/asyncband/*/asyncband/oneshot/) | `oneshot` | Send one value from one sender to one receiver. |
-| | [`mpsc`](https://docs.rs/asyncband/*/asyncband/mpsc/) | `mpsc` | Send each value from multiple producers to one receiver with bounded backpressure or an unbounded queue. |
-| | [`broadcast`](https://docs.rs/asyncband/*/asyncband/broadcast/) | `broadcast` | Deliver every value to receivers active at send time; retain an unbounded backlog until each consumes or drops. |
-| | [`watch`](https://docs.rs/asyncband/*/asyncband/watch/) | `watch` | Publish cloneable latest state from one or more senders; receivers independently coalesce intermediate updates. |
-| Object reuse | [`pool`](https://docs.rs/asyncband/*/asyncband/pool/) | `pool` | Reuse objects through bounded or unbounded pool variants. |
-| Sync interop | [`FutureExt`](https://docs.rs/asyncband/*/asyncband/blocking/trait.FutureExt.html) | `blocking` | Drive one runtime-agnostic future from a blocking thread. |
+| Area | API | Feature | Use |
+| -------------------- | ---------------------------------------------------------------------------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------- |
+| Locks and conditions | [`Mutex`](https://docs.rs/asyncband/*/asyncband/mutex/struct.Mutex.html) | `mutex` | Protect shared data with asynchronous mutual exclusion. |
+| | [`RwLock`](https://docs.rs/asyncband/*/asyncband/rwlock/struct.RwLock.html) | `rwlock` | Allow multiple readers or one writer. |
+| | [`Condvar`](https://docs.rs/asyncband/*/asyncband/condvar/struct.Condvar.html) | `condvar` | Wait for notifications while releasing a mutex. |
+| Coordination | [`Semaphore`](https://docs.rs/asyncband/*/asyncband/semaphore/struct.Semaphore.html) | `semaphore` | Limit concurrent work by acquiring permits. |
+| | [`Barrier`](https://docs.rs/asyncband/*/asyncband/barrier/struct.Barrier.html) | `barrier` | Synchronize a fixed number of participants at a reusable rendezvous. |
+| | [`ManualResetEvent`](https://docs.rs/asyncband/*/asyncband/event/struct.ManualResetEvent.html) | `event` | Signal current and future waits until explicitly reset. |
+| | [`Latch`](https://docs.rs/asyncband/*/asyncband/latch/struct.Latch.html) | `latch` | Wait until a fixed one-way countdown reaches zero. |
+| | [`WaitGroup`](https://docs.rs/asyncband/*/asyncband/waitgroup/struct.WaitGroup.html) | `waitgroup` | Dynamically register participants and wait until all have completed. |
+| | [`Shutdown`](https://docs.rs/asyncband/*/asyncband/shutdown/struct.Shutdown.html) | `shutdown` | Request shutdown and wait until all completion guards are dropped. |
+| Work coalescing | [`Once`](https://docs.rs/asyncband/*/asyncband/once/struct.Once.html) | `once` | Complete one asynchronous initialization; cancelled or panicked attempts may be retried. |
+| | [`OnceCell`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceCell.html) | `once-cell` | Store one value from an access-time initializer; failed, cancelled, or panicked attempts may be retried. |
+| | [`LazyCell`](https://docs.rs/asyncband/*/asyncband/once/struct.LazyCell.html) | `lazy-cell` | Initialize one value with a stored function and resume the same in-flight future after caller cancellation. |
+| | [`OnceMap`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceMap.html) | `once-map` | Coalesce work per key and retain each successful value until explicitly removed. |
+| | [`Group`](https://docs.rs/asyncband/*/asyncband/singleflight/struct.Group.html) | `singleflight` | Coalesce overlapping work per key without retaining completed values. |
+| Communication | [`Completion`](https://docs.rs/asyncband/*/asyncband/completion/struct.Completion.html) | `completion` | Publish one shared result to any number of current and future observers. |
+| | [`oneshot`](https://docs.rs/asyncband/*/asyncband/oneshot/) | `oneshot` | Send one value from one sender to one receiver. |
+| | [`mpsc`](https://docs.rs/asyncband/*/asyncband/mpsc/) | `mpsc` | Send each value from multiple producers to one receiver with bounded backpressure or an unbounded queue. |
+| | [`broadcast`](https://docs.rs/asyncband/*/asyncband/broadcast/) | `broadcast` | Deliver every value to receivers active at send time; retain an unbounded backlog until each consumes or drops. |
+| | [`watch`](https://docs.rs/asyncband/*/asyncband/watch/) | `watch` | Publish cloneable latest state from one or more senders; receivers independently coalesce intermediate updates. |
+| Object reuse | [`pool`](https://docs.rs/asyncband/*/asyncband/pool/) | `pool` | Reuse objects through bounded or unbounded pool variants. |
+| Sync interop | [`FutureExt`](https://docs.rs/asyncband/*/asyncband/blocking/trait.FutureExt.html) | `blocking` | Drive one runtime-agnostic future from a blocking thread. |
## Synchronous interoperability
diff --git a/src/pages/downloads.md b/src/pages/downloads.md
index ec85956..ada7e8c 100644
--- a/src/pages/downloads.md
+++ b/src/pages/downloads.md
@@ -20,7 +20,7 @@ You can verify the integrity of a downloaded release using the PGP signatures an
Apache Asyncband (Incubating) releases are provided as source archives. The latest release is **0.7.2**, the first Apache Incubator release.
-- Current release: [apache-asyncband-0.7.2-incubating-src.tar.gz](https://www.apache.org/dyn/closer.lua/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz)
-- PGP: [apache-asyncband-0.7.2-incubating-src.tar.gz.asc](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.asc)
-- SHA-512: [apache-asyncband-0.7.2-incubating-src.tar.gz.sha512](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.sha512)
-- Keys: [KEYS](https://downloads.apache.org/incubator/asyncband/KEYS)
+* Current release: [apache-asyncband-0.7.2-incubating-src.tar.gz](https://www.apache.org/dyn/closer.lua/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz)
+* PGP: [apache-asyncband-0.7.2-incubating-src.tar.gz.asc](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.asc)
+* SHA-512: [apache-asyncband-0.7.2-incubating-src.tar.gz.sha512](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.sha512)
+* Keys: [KEYS](https://downloads.apache.org/incubator/asyncband/KEYS)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@asyncband.apache.org
For additional commands, e-mail: commits-help@asyncband.apache.org