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 82 83 84 85 86 87 88 89 90 | 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 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /* eslint-disable tsdoc/syntax */ import { StateWorker } from '../handler/handler'; import { Store } from '../store/store'; declare global { /** * Global [SGRUD](https://sgrud.github.io) namespace. */ namespace sgrud { /** * `@sgrud/state` - The [SGRUD](https://sgrud.github.io) State Machine. */ namespace state { /** * Global **effects** namespace. Within this namespace **effects** are * provided by the {@link Implant} decorator to the {@link StateWorker}. */ namespace effects {} } } } /** * Abstract **Effect** base class. When this class is extended and decorated * with the {@link Implant} decorator or {@link StateWorker.implant}ed through * the {@link StateHandler}, its {@link function} will be made available to * {@link Store.Action}s through the global {@link sgrud.state.effects} * namespace. * * @typeParam K - The {@link Store.Effect} `locate` type. * * @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 FetchEffect extends Effect { * * public override function( * this: StateWorker * ): Store.Effects['importScripts'] { * return async(...urls) => { * return importScripts(...urls); * }; * } * * } * ``` */ export abstract class Effect<K extends Store.Effect = Store.Effect> { /** * Public **constructor** (which should never be called). * * @throws A {@link TypeError} upon construction. */ public constructor() { throw new TypeError('Effect.constructor'); } /** * Abstract **function** responsible for returning the bound {@link Effect}. * When an {@link StateWorker.implant}ed {@link Effect} is invoked, it is * bound to the polymorphic `this` of the {@link StateWorker} upon invocation. * This **function** provides the means of interacting with this bond, as in, * utilizing the polymorphic `this` of the {@link StateWorker} to provide the * bound {@link Effect}, e.g., by utilizing `protected` properties and methods * of the bound-to {@link StateWorker}. * * @param this - The explicit polymorphic `this` parameter. * @returns This {@link Effect} bound to the {@link StateWorker}. */ public abstract function(this: StateWorker): Store.Effects[K]; } |