import type { Expand, Getter, MaybeBoxOrGetter } from "../types.js"; declare const BoxSymbol: unique symbol; declare const isWritableSymbol: unique symbol; export type ReadableBox = { readonly [BoxSymbol]: true; readonly current: T; }; export type WritableBox = ReadableBox & { readonly [isWritableSymbol]: true; current: T; }; /** * Creates a writable box. * * @returns A box with a `current` property which can be set to a new value. * Useful to pass state to other functions. * * @see {@link https://runed.dev/docs/functions/box} */ export declare function box(): WritableBox; /** * Creates a writable box with an initial value. * * @param initialValue The initial value of the box. * @returns A box with a `current` property which can be set to a new value. * Useful to pass state to other functions. * * @see {@link https://runed.dev/docs/functions/box} */ export declare function box(initialValue: T): WritableBox; export declare namespace box { export var from: typeof boxFrom; var _a: typeof boxWith; export var flatten: typeof boxFlatten; export var readonly: typeof toReadonlyBox; export var isBox: (value: unknown) => value is ReadableBox; export var isWritableBox: (value: unknown) => value is WritableBox; export { _a as with }; } /** * Creates a readonly box * * @param getter Function to get the value of the box * @returns A box with a `current` property whose value is the result of the getter. * Useful to pass state to other functions. * * @see {@link https://runed.dev/docs/functions/box} */ declare function boxWith(getter: () => T): ReadableBox; /** * Creates a writable box * * @param getter Function to get the value of the box * @param setter Function to set the value of the box * @returns A box with a `current` property which can be set to a new value. * Useful to pass state to other functions. * * @see {@link https://runed.dev/docs/functions/box} */ declare function boxWith(getter: () => T, setter: (v: T) => void): WritableBox; /** * Creates a box from either a static value, a box, or a getter function. * Useful when you want to receive any of these types of values and generate a boxed version of it. * * @returns A box with a `current` property whose value. * * @see {@link https://runed.dev/docs/functions/box} */ declare function boxFrom(value: T | WritableBox): WritableBox; declare function boxFrom(value: ReadableBox): ReadableBox; declare function boxFrom(value: Getter): ReadableBox; declare function boxFrom(value: MaybeBoxOrGetter): ReadableBox; declare function boxFrom(value: T): WritableBox; type GetKeys = { [K in keyof T]: T[K] extends U ? K : never; }[keyof T]; type RemoveValues = Omit>; type BoxFlatten> = Expand ? T : never; }, never> & RemoveValues<{ readonly [K in keyof R]: R[K] extends WritableBox ? never : R[K] extends ReadableBox ? T : never; }, never>> & RemoveValues<{ [K in keyof R]: R[K] extends ReadableBox ? never : R[K]; }, never>; /** * Function that gets an object of boxes, and returns an object of reactive values * * @example * const count = box(0) * const flat = box.flatten({ count, double: box.with(() => count.current) }) * // type of flat is { count: number, readonly double: number } * * @see {@link https://runed.dev/docs/functions/box} */ declare function boxFlatten>(boxes: R): BoxFlatten; /** * Function that converts a box to a readonly box. * * @example * const count = box(0) // WritableBox * const countReadonly = box.readonly(count) // ReadableBox * * @see {@link https://runed.dev/docs/functions/box} */ declare function toReadonlyBox(b: ReadableBox): ReadableBox; export {};