UNPKG

nanostores

Version:

A tiny (265 bytes) state manager for React/Preact/Vue/Svelte with many atomic tree-shakable stores

87 lines (79 loc) 2.54 kB
import type { ReadableAtom } from '../atom/index.js' import type { AnyStore, Store, StoreValue } from '../map/index.js' import type { Task } from '../task/index.js' export type StoreValues<Stores extends AnyStore[]> = { [Index in keyof Stores]: StoreValue<Stores[Index]> } type A = ReadableAtom<number> type B = ReadableAtom<string> type C = (...values: StoreValues<[A, B]>) => void interface Computed { <Value, OriginStore extends Store>( stores: OriginStore, cb: (value: StoreValue<OriginStore>) => Task<Value> ): ReadableAtom<undefined | Value> <Value, OriginStores extends AnyStore[]>( stores: [...OriginStores], cb: (...values: StoreValues<OriginStores>) => Task<Value> ): ReadableAtom<undefined | Value> <Value, OriginStore extends Store>( stores: OriginStore, cb: (value: StoreValue<OriginStore>) => Value ): ReadableAtom<Value> /** * Create derived store, which use generates value from another stores. * * ```js * import { computed } from 'nanostores' * * import { $users } from './users.js' * * export const $admins = computed($users, users => { * return users.filter(user => user.isAdmin) * }) * ``` * * An async function can be evaluated by using {@link task}. * * ```js * import { computed, task } from 'nanostores' * * import { $userId } from './users.js' * * export const $user = computed($userId, userId => task(async () => { * const response = await fetch(`https://my-api/users/${userId}`) * return response.json() * })) * ``` */ <Value, OriginStores extends AnyStore[]>( stores: [...OriginStores], cb: (...values: StoreValues<OriginStores>) => Task<Value> | Value ): ReadableAtom<Value> } export const computed: Computed interface Batched { <Value, OriginStore extends Store>( stores: OriginStore, cb: (value: StoreValue<OriginStore>) => Task<Value> | Value ): ReadableAtom<Value> /** * Create derived store, which use generates value from another stores. * * ```js * import { batched } from 'nanostores' * * const $sortBy = atom('id') * const $category = atom('') * * export const $link = batched([$sortBy, $category], (sortBy, category) => { * return `/api/entities?sortBy=${sortBy}&category=${category}` * }) * ``` */ <Value, OriginStores extends AnyStore[]>( stores: [...OriginStores], cb: (...values: StoreValues<OriginStores>) => Task<Value> | Value ): ReadableAtom<Value> } export const batched: Batched