All files Store.ts

73.91% Statements 17/23
85.71% Branches 12/14
75% Functions 6/8
73.91% Lines 17/23

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                                9x 8x             9x 9x 9x                   23x     23x 19x 19x 17x 17x 17x 21x     17x 17x                 10x 10x          
import { Reducer, ActionLike } from './types';
import { Epic } from './Epic';
import { Notify } from './Notify';
 
type Listener = () => void;
 
export class Store<TState = any> {
  public isEnabled: boolean = false;
  public state: TState | undefined = undefined;
  public reducer: Reducer<TState> | null = null;
  public epic: Epic | null = null;
  private listeners: Listener[] = [];
 
  constructor(public name: symbol, public displayName: string) {}
 
  initState() {
    if (this.reducer) {
      this.state = this.reducer(undefined, {
        type: [Symbol('__INIT__'), 'init'],
      });
    }
  }
 
  enable({ epic, reducer }: { epic?: Epic; reducer?: Reducer<TState> }) {
    this.epic = epic || null;
    this.reducer = reducer || null;
    this.isEnabled = true;
  }
 
  disable() {
    this.epic = null;
    this.reducer = null;
    this.isEnabled = false;
  }
 
  dispatch(action: ActionLike, notify?: Notify) {
    Iif (!this.isEnabled) {
      return;
    }
    if (this.reducer) {
      const nextState = this.reducer(this.state, action);
      if (nextState !== this.state) {
        this.state = nextState;
        const notifyFn = () => {
          for (const listener of this.listeners) {
            listener();
          }
        };
        Eif (notify) {
          notify.add(notifyFn);
        } else {
          notifyFn();
        }
      }
    }
  }
 
  subscribe(listener: Listener) {
    this.listeners.push(listener);
    return () => {
      this.listeners.splice(this.listeners.indexOf(listener), 1);
    };
  }
}