import { DisposeCallback, GraphNode, NodeDefinition, StatefulGraphNode, StatefulNodeDefinition, StatefulNodeType } from '../../types/graph'; /** * An instance of the [[optimistic]] node. * See the [[optimistic]] documentation to find out more. */ export interface OptimisticNode extends StatefulGraphNode<'optimistic', OptimisticNodeProperties> { } /** * A definition of the [[optimistic]] node. * See the [[optimistic]] documentation to find out more. */ export interface OptimisticNodeDefinition extends StatefulNodeDefinition<'optimistic', OptimisticNodeProperties> { } export interface OptimisticNodeProperties { target: NodeDefinition; } export interface OptimisticNodeState { pendingSetOperations: Array; setResults: { [operationId: string]: GraphNode; }; value: GraphNode | undefined; } export interface OptimisticNodeData { setSubscriptions: { [operationId: string]: DisposeCallback; }; } /** * The implementation of the [[optimistic]] node. * See the [[optimistic]] documentation to learn more. */ export declare const OptimisticNodeType: StatefulNodeType<'optimistic', OptimisticNodeProperties>; /** * Creates a new instance of the [[optimistic]] node. This node can be used to make an asynchronously * settable node behave in a synchronous way by pretending that the set operation was synchronous, * and by serving that value as a result of evaluate operation. * * * @example **Wrap fromPromise in optimistic** * ```js * import muster, { fromPromise, ok, optimistic, ref, set, value } from '@dws/muster'; * * const app = muster({ * userPreferences: optimistic(fromPromise({ * get: () => fetch('http://api.yourproject.com/user/preferences').then((result) => { * console.log('Data loaded from the server'); * return result; * }), * set: (params, value) => fetch('http://api.yourproject.com/user/preferences', { * body: JSON.stringify(value), * method: 'POST', * }).then((result) => { * console.log('Data saved on the server'); * return ok(); * }), * })), * }); * * console.log('Subscribing to userPreferences'); * let isFirstTime = true; * app.resolve(ref('userPreferences')).subscribe((preferences) => { * console.log('User preferences:', preferences); * if (!isFirstTime) return; * isFirstTime = false; * console.log('Changing user preferences'); * app.resolve(set('userPreferences', value({ likeMuster: true }))).then(() => {}); * }); * * // Console output: * // Subscribing to userPreferences * // Data loaded from the server * // User preferences: { likeMuster: false } * // Changing user preferences * // User preferences: { likeMuster: true } * // Data saved on the server * ``` * Note that the `userPreferences` emitted before the set was completed. This is because * the `optimistic` node assumes that the `set` operation will be successful, and immediately updates * the `evaluate` operation output. */ export declare function optimistic(target: NodeDefinition): OptimisticNodeDefinition; export declare function isOptimisticNodeDefinition(optimistic: NodeDefinition): optimistic is OptimisticNodeDefinition;