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 91 92 | 4x 4x 4x 3x 4x 4x 4x 4x 4x 4x 4x 4x | import { Observable } from 'rxjs'; import { AC, Deps, ExtractPayload, ActionLike, ActionType } from './types'; import { getACType } from './utils'; export type EpicResult = Observable<ActionLike> | ActionLike | ActionLike[]; export type EpicHandler<TAC extends AC> = ( payload: ExtractPayload<ReturnType<TAC>>, deps: Deps, action: ReturnType<TAC> & { type: symbol } ) => EpicResult; export class Epic { handlers: Map<symbol, Map<string, Array<EpicHandler<any>>>> = new Map(); moduleHandlers: Map<symbol, Array<EpicHandler<any>>> = new Map(); attach(epic: Epic) { const subHandlers = epic.handlers; for (const symbol of epic.handlers.keys()) { for (const type of epic.handlers.get(symbol)!.keys()) { this.createKey([symbol, type]); this.handlers .get(symbol)! .get(type)! .push(...subHandlers.get(symbol)!.get(type)); } } return this; } on<TAC extends AC>(ac: TAC, handler: EpicHandler<TAC>) { return this.add(ac, handler); } onMany<TAC extends AC, TAC2 extends AC>( ac: [TAC, TAC2], handler: EpicHandler<TAC | TAC2> ): this; onMany<TAC extends AC, TAC2 extends AC, TAC3 extends AC>( ac: [TAC, TAC2, TAC3], handler: EpicHandler<TAC | TAC2 | TAC3> ): this; onMany<TAC extends AC, TAC2 extends AC, TAC3 extends AC, TAC4 extends AC>( ac: [TAC, TAC2, TAC3, TAC4], handler: EpicHandler<TAC | TAC2 | TAC3 | TAC4> ): this; onMany< TAC extends AC, TAC2 extends AC, TAC3 extends AC, TAC4 extends AC, TAC5 extends AC >( ac: [TAC, TAC2, TAC3, TAC4, TAC5], handler: EpicHandler<TAC | TAC2 | TAC3 | TAC4 | TAC5> ): this; onMany(ac: AC[], handler: EpicHandler<AC>) { return this.add(ac, handler); } onModule(moduleSymbol: symbol, handler: EpicHandler<AC>) { if (!this.moduleHandlers.has(moduleSymbol)) { this.moduleHandlers.set(moduleSymbol, []); } this.moduleHandlers.get(moduleSymbol!)!.push(handler); } private createKey(actionType: ActionType) { const [symbol, type] = actionType; if (!this.handlers.has(symbol)) { this.handlers.set(symbol, new Map()); } const map = this.handlers.get(symbol)!; Eif (!map.has(type)) { map.set(type, []); } } private add(ac: AC | AC[], handler: EpicHandler<AC>) { const keys = Array.isArray(ac) ? ac.map(x => getACType(x)) : [getACType(ac)]; keys.forEach(([symbol, type]) => { this.createKey([symbol, type]); this.handlers .get(symbol)! .get(type)! .push(handler); }); return this; } } |