π§© Selectors β
select lets you create readonly derived chunks from another chunk.
It helps you listen to just the part of state you care about β without unnecessary updates.
Basic Example β
import { chunk, select } from "stunk";
const user = chunk({
name: "Abdulzeez",
age: 28,
email: "abdulzeez@example.com",
});
const name = select(user, (u) => u.name);
const age = select(user, (u) => u.age);
name.subscribe((n) => console.log("Name:", n));
age.subscribe((a) => console.log("Age:", a));user.set((u) => ({ ...u, name: "Fola" }));
// β
name updates automaticallyReadonly by Design β
Selectors canβt be updated directly β only through their source chunk.
name.set("Qudus"); // β throws error
user.set((u) => ({ ...u, name: "Qudus" })); // β
correct wayNested Selection β
You can easily select nested data:
const app = chunk({
profile: { name: "Aduke", age: 22 },
settings: { theme: "dark" },
});
const theme = select(app, (s) => s.settings.theme);
theme.subscribe(console.log); // "dark"
app.set((s) => ({
...s,
settings: { ...s.settings, theme: "light" },
}));
// β
only theme subscribers are notifiedShallow Equality Optimization β
For arrays or objects, use shallow equality to skip redundant updates.
const todos = chunk([
{ id: 1, text: "Learn Stunk", done: false },
{ id: 2, text: "Ship feature", done: true },
]);
const completed = select(
todos,
(list) => list.filter((t) => t.done),
{ useShallowEqual: true }
);If the content doesnβt actually change, subscribers wonβt re-trigger.
Chaining Selectors β
Selectors can derive from each other:
const app = chunk({
user: { info: { name: "Asake", theme: "dark" } },
});
const user = select(app, (s) => s.user);
const info = user.derive((u) => u.info);
const theme = info.derive((i) => i.theme);Cleanup β
Selectors unsubscribe automatically when destroyed:
const source = chunk({ value: 1 });
const selected = select(source, (s) => s.value);
selected.destroy(); // stops listeningBest Practices β
β
Use useShallowEqual for arrays/objects β
Select only what you need β
Avoid heavy transformations (use computed instead) β
Clean up unused selectors
Why Use select? β
β‘ Improves performance π§ Prevents unwanted updates π Readonly and safe π‘ Works great with derived state
Next: Batch Updates β update multiple chunks efficiently π