⚡ Async State 
asyncChunk helps you handle loading, errors, retries, and caching automatically — perfect for fetching data or running async operations without stress.
🚀 What It Handles for You 
✅ Loading, error, and data states
 ✅ Caching and background refresh
 ✅ Retry with delay
 ✅ Optimistic updates
 ✅ Type-safe and framework-agnostic
Basic Example 
ts
import { asyncChunk } from "stunk";
type User = { id: number; name: string; email: string };
const userChunk = asyncChunk<User>(async () => {
  const res = await fetch("/api/user");
  if (!res.ok) throw new Error("Failed to fetch user");
  return res.json();
});
userChunk.subscribe(({ loading, error, data }) => {
  if (loading) console.log("Loading user...");
  if (error) console.log("Error:", error.message);
  if (data) console.log("Loaded:", data.name);
});Parameterized Fetch 
ts
const userChunk = asyncChunk<User, Error, [number]>(async (id) => {
  const res = await fetch(`/api/users/${id}`);
  if (!res.ok) throw new Error("User not found");
  return res.json();
});
// Load a specific user
await userChunk.reload(7);
// Or set the param for later
userChunk.setParams(7);Caching and Refresh 
ts
const dataChunk = asyncChunk(fetchData, {
  refresh: {
    staleTime: 60_000,    // Fresh for 1 min
    cacheTime: 300_000,   // Keep cached for 5 mins
    refetchInterval: 30_000 // Auto-refresh every 30s
  },
  retryCount: 3,
  retryDelay: 1000,
});Conditional Fetch 
ts
const userChunk = asyncChunk(fetchUser, { enabled: false });
// Fetch manually when ready
await userChunk.reload();
// Or use parameters
const postsChunk = asyncChunk(fetchPosts, { enabled: false });
if (userId) postsChunk.reload(userId);Reload & Refresh 
ts
await userChunk.reload();  // Force reload
await userChunk.refresh(); // Smart refresh (uses cache)Optimistic Update 
ts
userChunk.mutate((user) => ({
  ...user!,
  name: "Fola Updated"
}));
// Rollback on failure
try {
  await updateUserAPI({ name: "Fola Updated" });
} catch {
  userChunk.reload(); // revert
}Pagination Example 
ts
const usersChunk = asyncChunk(fetchUsers, {
  pagination: { pageSize: 10, mode: "accumulate" },
});
await usersChunk.nextPage(); // Load more
await usersChunk.goToPage(3);Reset and Cleanup 
ts
userChunk.reset();   // Reset to initial
userChunk.destroy(); // Full cleanupInterface (Summary) 
ts
interface AsyncChunk<T> {
  get(): { loading: boolean; error: Error | null; data: T | null };
  reload(...params: any[]): Promise<void>;
  refresh(...params: any[]): Promise<void>;
  mutate(fn: (data: T | null) => T): void;
  reset(): void;
  destroy(): void;
}Why Use AsyncChunk? 
⚡ Auto-handles loading & errors 🧠 Built-in cache & retry logic 🔒 Type-safe and clean 🌍 Works in any JS or TS app
Next: let’s look at once — run something only one time, no matter what. 🚀