//#region src/observer/index.d.ts /** * Observer utilities * * @example * ```ts * import { observe } from '@kazupon/jts-utils/observer' * ``` * * @module observer */ /** * @license MIT * @author kazuya kawaguchi (a.k.a. kazupon) */ /** * State value subscribe handler */ type ObservableStateSubscribeHandler = (state: State) => void; /** * State value unsubscribe handler */ interface ObservableStateUnsubscribeHandler extends Disposable { (): void; } /** * State value observable */ interface Observable extends Disposable { /** * listener count */ readonly listenerCount: number; /** * add state subscription * * @param listener - listener * @returns unsubscribe handler */ subscribe(listener: ObservableStateSubscribeHandler): ObservableStateUnsubscribeHandler; /** * notify state value * * @param state - updated state value */ notify(state: State): void; /** * dispose observable */ dispose(): void; } /** * observe state value * * @example * ```ts * import { observe } from '@kazupon/jts-utils' * * // create observable * const observer = observe<{ a: number }>() * * // subscribe state change * const unsubscribe = observer.subscribe((state) => { * console.log(state) * }) * * // notify state change * observer.notify({ a: 1 }) * * // unsubscribe * unsubscribe() * ``` * * if javascript runtime supports `Symbol.dispose`, you can use it as follows: * * @example * ```ts * import { observe } from '@kazupon/jts-utils' * * // create observable with `using` syntax * // when the scope is exited, `observer.dispose` will be called automatically * using observer = observe<{ a: number }>() * * const unsubscribe1 = observer.subscribe((state) => { * console.log(state) * }) * * // subscribe with `using` syntax * // when the scope is exited, `unsubscribe2` will be called automatically * using unsubscribe2 = observer.subscribe((state) => { * console.log(state) * }) * * observer.notify({ a: 1 }) * ``` * * @returns observable state value */ declare function observe(): Readonly>; //#endregion export { Observable, ObservableStateSubscribeHandler, ObservableStateUnsubscribeHandler, observe };