Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 16x 16x 16x 16x 16x 16x 16x 16x 16x 2x 3x 1x 1x 3x 3x 3x 2x 1x 1x | import { Bus } from '@sgrud/bus';
import { StateWorker } from '../handler/handler';
import { Implant } from '../handler/implant';
import { Store } from '../store/store';
import { Effect } from './effect';
declare global {
namespace sgrud.state.effects {
/**
* {@link Implant}ed {@link StateEffect} providing convenient access to the
* **state** of {@link Store}s from within {@link StateWorker.dispatch}ed
* {@link Store.Action}s. This {@link StateEffect} in combination with the
* {@link DispatchEffect} can be used to implement complex interactions
* between different {@link Store}s.
*
* @param handle - The {@link Bus.Handle} representing the {@link Store}.
* @typeParam T - The extending {@link Store} {@link InstanceType}.
* @returns The current **state** of the {@link Store}.
*
* @example
* Retrieve the **state** from another {@link Store}:
* ```ts
* import { type Bus } from '@sgrud/bus';
* import { Stateful, Store } from '@sgrud/state';
*
* @Stateful('io.github.sgrud.store.example', { state: undefined })
* export class ExampleStore extends Store<ExampleStore> {
*
* public readonly state?: Store.State<Store>;
*
* public async getState(handle: Bus.Handle): Promise<Store.State<this>> {
* const state = await sgrud.state.effects.state(handle);
*
* return { ...this, state };
* }
*
* }
* ```
*
* @see {@link StateEffect}
*/
function state<T extends Store>(
handle: Bus.Handle
): Promise<Store.State<T> | undefined>;
}
}
/**
* Built-in **StateEffect** extending the abstract {@link Effect} base class.
* This **StateEffect** is automatically {@link StateWorker.implant}ed when the
* `@sgrud/state` module is imported and can therefore be always used in
* {@link Store.Action}s.
*
* @decorator {@link Implant}
*
* @see {@link Effect}
*/
@Implant('state')
export class StateEffect extends Effect {
/**
* Overridden **function** binding the {@link StateEffect} to the polymorphic
* `this` of the {@link StateWorker}.
*
* @param this - The explicit polymorphic `this` parameter.
* @returns This {@link StateEffect} bound to the {@link StateWorker}.
*/
public override function(this: StateWorker): Store.Effects['state'] {
return async(handle) => {
const state = this.states.get(handle)?.has(this)
? this.states.get(handle)?.get(this)
: this.states.get(handle)?.get(self);
return state?.value as Store.State<any>;
};
}
}
|