import {AnalyticsContext} from './AnalyticsContext'; export type DispatchAnalytics = (eventName: string, context: AnalyticsContext) => T; export type AnalyticsExtender = (dispatcher: AnalyticsDispatcher) => AnalyticsDispatcher; export class AnalyticsDispatcher { constructor( private readonly dispatchAnalytics: DispatchAnalytics, readonly context: AnalyticsContext = new AnalyticsContext(), ) {} dispatch(eventName: string = '', analyticsContext?: Partial): T { const unionContext = this.context.union(analyticsContext); return this.dispatchAnalytics(eventName, unionContext); } extend(...extenders: Array>): AnalyticsDispatcher { return extenders.reduce((acc: AnalyticsDispatcher, extender) => extender(acc), this); } }