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 | 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 49x 13x 49x 49x 1x 1x | import { from, switchMap } from 'rxjs';
import { Effect } from '../effect/effect';
import { Store } from '../store/store';
import { StateHandler } from './handler';
/**
* The **Implant** decorator, when applied to classes extending the abstract
* {@link Effect} base class, {@link StateHandler.implant}s the decorated class
* under the `locate` in the global {@link sgrud.state.effects} namespace to be
* used within {@link StateHandler.dispatch}ed {@link Store.Action}s.
*
* @param locate - The `locate` to address the {@link Effect} by.
* @typeParam K - The {@link Store.Effect} `locate` type.
* @typeParam T - An {@link Effect} constructor type.
* @returns A class constructor decorator.
*
* @example
* An `importScripts` **Effect**:
* ```ts
* import { Effect, Implant, type StateWorker, type Store } from '@sgrud/state';
*
* declare global {
* namespace sgrud.state.effects {
* function importScripts(...urls: (string | URL)[]): Promise<void>;
* }
* }
*
* @Implant('importScripts')
* export class ImportScriptsEffect extends Effect {
*
* public override function(
* this: StateWorker
* ): Store.Effects['importScripts'] {
* return async(...urls) => {
* return importScripts(...urls);
* };
* }
*
* }
* ```
*
* @see {@link StateHandler}
* @see {@link Stateful}
*/
export function Implant<
T extends new () => Effect<K>,
K extends Store.Effect
>(locate: K) {
/**
* @param constructor - The class `constructor` to be decorated.
*/
return function(constructor: T): void {
from(StateHandler).pipe(switchMap((handler) => {
return handler.implant(locate, constructor);
})).subscribe();
};
}
|