import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { filter, map } from 'rxjs/operators';

interface CommonsEvent {
  key: any;
  data?: any;
}

@Injectable({
  providedIn: 'root'
})

export class DevuiCommonsService {
  private _eventBus: Subject<CommonsEvent>;

  constructor() {
    this._eventBus = new Subject<CommonsEvent>();
  }

  broadcast(key: any, data?: any): void {
    this._eventBus.next({key, data});
  }

  on<T>(key: any): Observable<T> {
    return this._eventBus.asObservable().pipe(
      filter(event => event.key === key),
      map(event => <T>event.data)
    );
  }
}