{"version":3,"file":"jtablada-notification-center.mjs","sources":["../../../projects/notification-center/src/lib/notification-center.service.ts","../../../projects/notification-center/src/lib/notification-center.module.ts","../../../projects/notification-center/src/public-api.ts","../../../projects/notification-center/src/jtablada-notification-center.ts"],"sourcesContent":["/*\n * ***********************************************************************************************************\n *\n * Author: Johnny Alexander Tablada-Rodriguez\n * Created On: Friday, 20 August, 2021\n * File: notification-center.service.ts\n * Project: notification-center-service\n * Notice: Copyright (c) 2021.  (R)All rights reserved.\n *\n * ***********************************************************************************************************\n */\n\n   import { Injectable }            from '@angular/core';\n   import { Subject, Subscription } from 'rxjs';\n   \n   const DELETE_COUNT:    number =  1;\n   const INDEX_NOT_FOUND: number = -1;\n   const NO_LENGTH:       number =  0;\n   \n   export type ObjectType = Record <string, unknown>;\n\n   export interface UserInfo { [ key : string ] : boolean | number | string | object }\n\n   export interface Notification { name      : string,\n                                   sender    : ObjectType,\n                                   userInfo ?: UserInfo | null }\n\n   export type NotificationSubject = Subject <Notification>;\n\n   export type NotificationHandler = ( notification : Notification ) => void;\n\n   export type Sender = ObjectType | null;\n\n   export type Subscriber = { observer      : ObjectType;\n                              name         ?: string;\n                              handler      ?: NotificationHandler;\n                              sender       ?: Sender;\n                              subscription ?: Subscription };\n\n   export type Subscribers = Subscriber [];\n   \n   export type Publisher = { subject     : NotificationSubject;\n                             sender     ?: Sender;\n                             subscribers : Subscribers };\n   \n   export type Publishers = Publisher [];\n\n   export interface Emitters { [ index : string ] : Publishers }\n\n// ***********************************************************************************************************\n\n   @Injectable ( { providedIn : 'root' } )\n\n   export class NotificationCenterService\n   {\n       private readonly _emitters_              : Emitters;\n       private readonly _subscribersToAnyByAny_ : Subscribers;\n       private readonly _subscribersToAnyByOne_ : Subscribers;\n       private readonly _subscribersToOneByAny_ : Subscribers;\n\n   // ========================================================================================================\n\n      constructor ()\n      {\n          this._emitters_              = {};\n          this._subscribersToAnyByAny_ = [];\n          this._subscribersToAnyByOne_ = [];\n          this._subscribersToOneByAny_ = [];\n      }\n    \n   // ========================================================================================================\n       \n       // public displayArrays () : void\n       // {\n       //     console.log ( '/'.repeat ( 80 ) );\n       //     console.log ( this._subscribersToAnyByAny_ );\n       //     console.log ( this._subscribersToAnyByOne_ );\n       //     console.log ( this._subscribersToOneByAny_ );\n       //     console.log ( this._emitters_ );\n       //     console.log ( '\\\\'.repeat ( 80 ) );\n       // }\n       \n   // ========================================================================================================\n    \n      public addObserver ( observer            : ObjectType,\n                           notificationHandler : NotificationHandler ) : void;\n      public addObserver ( observer            : ObjectType,\n                           notificationHandler : NotificationHandler,\n                           name                : string | null ) : void;\n      public addObserver ( observer            : ObjectType,\n                           notificationHandler : NotificationHandler,\n                           name                : string | null,\n                           sender              : Sender ) : void;\n      public addObserver ( observer            : ObjectType,\n                           notificationHandler : NotificationHandler,\n                           name               ?: string | null,\n                           sender             ?: Sender ) : void\n      {\n          const noSpecificMessage : boolean = ( undefined === name   || null === name   );\n          const noSpecificSender  : boolean = ( undefined === sender || null === sender );\n          const specificMessage   : boolean = ( undefined !== name   && null !== name   );\n          const specificSender    : boolean = ( undefined !== sender && null !== sender );\n    \n          const createSubscriber = ( subject : NotificationSubject ) : Subscriber =>\n                                   {\n                                       const subscription : Subscription = subject.subscribe ( notificationHandler );\n                                       const subscriber   : Subscriber   = { observer     : observer,\n                                                                             subscription : subscription };\n    \n                                       return ( subscriber );\n                                   };\n    \n          const createPublisher = () : Publisher =>\n                                  {\n                                      const subject     : NotificationSubject = new Subject <Notification> ();\n                                      const subscriber  : Subscriber          = createSubscriber ( subject );\n                                      const subscribers : Subscribers         = [ subscriber ];\n                                      const publisher   : Publisher           = { subject     : subject,\n                                                                                  sender      : sender,\n                                                                                  subscribers : subscribers };\n                                      \n                                      return ( publisher );\n                                  };\n          \n          const createPublishers = () : Publishers =>\n                                   {\n                                       const publisher  : Publisher  = createPublisher ();\n                                       const publishers : Publishers = [ publisher ];\n                                       \n                                       return ( publishers );\n                                   };\n    \n          const findPublisher = ( publisher : Publisher ) : boolean =>\n                                {\n                                    return ( noSpecificSender || ( sender === publisher.sender ) )\n                                };\n    \n          const findSubscriber = ( subscriber : Subscriber ) : boolean =>\n                                 {\n                                     return ( subscriber.observer === observer );\n                                 };\n          \n          const subscribe = ( publisher : Publisher ) : void =>\n                            {\n                                if ( noSpecificSender || ( sender === publisher.sender ) )\n                                {\n                                    if ( null === publisher.subscribers )\n                                        publisher.subscribers = [ createSubscriber ( publisher.subject ) ];\n                                    else\n                                    {\n                                        if ( publisher.subscribers.find ( findSubscriber ) === undefined )\n                                            publisher.subscribers.push ( createSubscriber ( publisher.subject ) );\n                                    }\n                                }\n                            };\n    \n          if ( specificMessage && specificSender ) // Case I -- A specific message by a specific sender\n          {\n              const publishers : Publishers | undefined = this._emitters_ [ name! ];\n              \n              if ( undefined === publishers )\n                  this._emitters_ [ name! ] = createPublishers ();\n              else\n              {\n                  if ( undefined === publishers.find ( findPublisher ) )\n                      publishers.push ( createPublisher () );\n                  else\n                      publishers.forEach ( subscribe );\n              }\n          }\n    \n          if ( specificMessage && noSpecificSender ) // Case II -- A specific message by any sender\n          {\n              const findSubscriber = ( subscriber : Subscriber ) : boolean =>\n                                     {\n                                         return ( subscriber.observer === observer &&\n                                                  subscriber.name     === name     &&\n                                                  subscriber.handler  === notificationHandler );\n                                     };\n              \n              if ( undefined !== this._emitters_ [ name! ] )\n                  this._emitters_ [ name! ].forEach ( subscribe );\n              \n              if ( undefined === this._subscribersToOneByAny_.find ( findSubscriber ) )\n                  this._subscribersToOneByAny_.push ( { observer : observer,\n                                                         handler : notificationHandler,\n                                                            name : name! } );\n          }\n          \n          if ( ( noSpecificMessage && specificSender   ) || // Case III - Any message by a specific sender\n               ( noSpecificMessage && noSpecificSender ) )  // Case IV -- Any message by any sender\n          {\n              const findSubscriber = ( subscriber : Subscriber ) : boolean =>\n                                     {\n                                         return ( subscriber.name         === undefined           &&\n                                                  subscriber.subscription === undefined           &&\n    \n                                                  subscriber.observer     === observer            &&\n                                                  subscriber.handler      === notificationHandler &&\n    \n                                                  ( subscriber.sender     === undefined           ||\n                                                    subscriber.sender     === sender ) );\n                                     };\n    \n              for ( const key in this._emitters_ )\n                  this._emitters_ [ key ].forEach ( subscribe );\n              \n              if ( noSpecificMessage && specificSender )\n                  if ( undefined === this._subscribersToAnyByOne_.find ( findSubscriber ) )\n                      this._subscribersToAnyByOne_.push ( { observer : observer,\n                                                              sender : sender,\n                                                             handler : notificationHandler } );\n              \n              if ( noSpecificMessage && noSpecificSender )\n                  if ( undefined === this._subscribersToAnyByAny_.find ( findSubscriber ) )\n                      this._subscribersToAnyByAny_.push ( { observer : observer,\n                                                             handler : notificationHandler } );\n          }\n      }\n    \n   // ========================================================================================================\n      \n      public postNotification ( notification : Notification ) : void;\n      public postNotification ( name   : string,\n                                sender : ObjectType ) : void;\n      public postNotification ( name     : string,\n                                sender   : ObjectType,\n                                userInfo : UserInfo | null ) : void;\n      public postNotification ( argument1 : Notification | string,\n                                sender   ?: ObjectType,\n                                userInfo ?: UserInfo | null ) : void\n      {\n          let notification         : Notification;\n          let notificationName     : string;\n          let notificationSender   : ObjectType;\n          let notificationUserInfo : UserInfo | undefined | null;\n          \n          if ( \"object\" === typeof arguments [ 0 ] )\n          {\n              notification       = arguments [ 0 ];\n              notificationName   = notification.name;\n              notificationSender = notification.sender;\n          }\n          else\n          {\n              [ notificationName,\n                notificationSender,\n                notificationUserInfo ] = arguments;\n              notification             = { name     : notificationName,\n                                           sender   : notificationSender,\n                                           userInfo : notificationUserInfo };\n          }\n          \n          if ( this._subscribersToOneByAny_.length > NO_LENGTH )\n              this._subscribersToOneByAny_.forEach ( ( subscriber : Subscriber ) : void =>\n                                                     {\n                                                         if ( subscriber.name === notificationName )\n                                                             if ( undefined !== subscriber.handler &&  null !== subscriber.handler )\n                                                                 this.addObserver ( subscriber.observer,\n                                                                                    subscriber.handler,\n                                                                                    notificationName,\n                                                                                    notificationSender );\n                                                     } ) ;\n          \n          if ( this._subscribersToAnyByOne_.length > NO_LENGTH )\n              this._subscribersToAnyByOne_.forEach ( ( subscriber : Subscriber ) : void =>\n                                                     {\n                                                         if ( subscriber.sender === notificationSender )\n                                                             if ( undefined !== subscriber.handler && null !== subscriber.handler )\n                                                                 this.addObserver ( subscriber.observer,\n                                                                                    subscriber.handler,\n                                                                                    notificationName,\n                                                                                    subscriber.sender );\n                                                     } );\n\n          if ( this._subscribersToAnyByAny_.length > NO_LENGTH )\n              this._subscribersToAnyByAny_.forEach ( ( subscriber : Subscriber ) : void =>\n                                                     {\n                                                         if ( undefined !== subscriber.handler && null !== subscriber.handler )\n                                                             this.addObserver ( subscriber.observer,\n                                                                                subscriber.handler,\n                                                                                notificationName,\n                                                                                notificationSender );\n                                                     } );\n          \n          const findPublisher = ( publisher : Publisher ) : boolean =>\n                                { return ( publisher.sender === notificationSender ); };\n          \n          const publishers : Publishers | undefined = this._emitters_ [ notificationName ];\n          \n          if ( undefined !== publishers )\n          {\n              const publisher : Publisher | undefined = publishers.find ( findPublisher );\n    \n              if ( undefined !== publisher )\n              {\n                  const { subject } = publisher;\n        \n                  subject.next ( notification );\n              }\n          }\n      }\n      \n   // ========================================================================================================\n      \n      public removeObserver ( observer : ObjectType ) : void;\n      \n      public removeObserver ( observer : ObjectType,\n                              name     : string | null ) : void;\n      \n      public removeObserver ( observer : ObjectType,\n                              name     : string | null,\n                              sender   : ObjectType | null ) : void;\n      \n      public removeObserver ( observer : ObjectType,\n                              name    ?: string | null,\n                              sender  ?: ObjectType | null ) : void\n      {\n          const noSpecificMessage : boolean = ( undefined === name   || null === name   );\n          const noSpecificSender  : boolean = ( undefined === sender || null === sender );\n          const specificMessage   : boolean = ( undefined !== name   && null !== name   );\n          const specificSender    : boolean = ( undefined !== sender && null !== sender );\n          \n          const findSubscriber = ( subscriber : Subscriber ) : boolean =>\n                                 {\n                                     const CASE_I : boolean = ( noSpecificMessage && noSpecificSender ) &&\n                                                              subscriber.observer === observer;\n                                     \n                                     const CASE_II : boolean = ( noSpecificMessage && specificSender ) &&\n                                                               subscriber.name     === undefined &&\n                                                               subscriber.sender   !== undefined &&\n                                                               subscriber.sender   === sender    &&\n                                                               subscriber.observer === observer;\n                                     \n                                     const CASE_III : boolean = ( specificMessage && noSpecificSender ) &&\n                                                                subscriber.sender   === undefined &&\n                                                                subscriber.name     !== undefined &&\n                                                                subscriber.name     === name      &&\n                                                                subscriber.observer === observer;\n                                     \n                                     const CASE_IV : boolean = ( specificMessage && specificSender ) &&\n                                                               subscriber.name     !== undefined &&\n                                                               subscriber.sender   !== undefined &&\n                                                               subscriber.name     === name      &&\n                                                               subscriber.sender   === sender    &&\n                                                               subscriber.observer === observer;\n                                     \n                                     return ( CASE_I || CASE_II || CASE_III || CASE_IV );\n                                 };\n          \n          const removePublisher = ( publisher : Publisher,\n                                    pubIndex  : number,\n                                    pubArray  : Publishers ) : void =>\n                                  {\n                                      const CASE_I     : boolean = noSpecificMessage && noSpecificSender;\n                                      const CASE_II    : boolean = noSpecificMessage && specificSender;\n                                      const CASE_III   : boolean = specificMessage   && noSpecificSender;\n                                      const CASE_IV    : boolean = specificMessage   && specificSender;\n                                      const CASE_I_III : boolean = ( CASE_I  || CASE_III );\n                                      const CASE_II_IV : boolean = ( CASE_II || CASE_IV  ) && publisher.sender === sender;\n    \n                                      if ( CASE_I_III || CASE_II_IV )\n                                      {\n                                          const { subscribers } = publisher;\n        \n                                          subscribers.forEach ( removeSubscriber );\n        \n                                          if ( NO_LENGTH === subscribers.length )\n                                              pubArray.splice ( pubIndex, DELETE_COUNT );\n                                      }\n                                  };\n          \n          const removeSubscriber = ( subscriber : Subscriber,\n                                     subIndex   : number,\n                                     subArray   : Subscribers ) : void =>\n                                   {\n                                       if ( subscriber.observer === observer )\n                                           if ( undefined !== subscriber.subscription )\n                                           {\n                                               const { subscription } = subscriber;\n    \n                                               subscription.unsubscribe ();\n                                               subArray.splice ( subIndex, DELETE_COUNT );\n                                           }\n                                   };\n          \n          if ( noSpecificMessage && noSpecificSender ) // CASE I\n          {\n              const remove_observer = ( subscribers : Subscribers ) : void =>\n                                      {\n                                          let index : number = subscribers.findIndex ( findSubscriber );\n                                          \n                                          while ( INDEX_NOT_FOUND !== index )\n                                          {\n                                              subscribers.splice ( index, DELETE_COUNT );\n                                              \n                                              index = subscribers.findIndex ( findSubscriber );\n                                          }\n                                      };\n              \n              remove_observer ( this._subscribersToAnyByAny_ );\n              remove_observer ( this._subscribersToAnyByOne_ );\n              remove_observer ( this._subscribersToOneByAny_ );\n\n              for ( const key in this._emitters_ )\n              {\n                  this._emitters_ [ key ].forEach ( removePublisher );\n                  \n                  if ( NO_LENGTH === this._emitters_ [ key ].length )\n                      delete this._emitters_ [ key ];\n              }\n          }\n          \n          if ( noSpecificMessage && specificSender ) // CASE II\n          {\n              let index : number = this._subscribersToAnyByOne_.findIndex ( findSubscriber );\n              \n              while ( INDEX_NOT_FOUND !== index )\n              {\n                  this._subscribersToAnyByOne_.splice ( index, DELETE_COUNT );\n                  \n                  index = this._subscribersToAnyByOne_.findIndex ( findSubscriber );\n              }\n              \n              for ( const key in this._emitters_ )\n              {\n                  this._emitters_ [ key ].forEach ( removePublisher );\n                  \n                  if ( NO_LENGTH === this._emitters_ [ key ].length )\n                      delete this._emitters_ [ key ];\n              }\n          }\n          \n          if ( specificMessage && noSpecificSender ) // CASE III\n          {\n              let index = this._subscribersToOneByAny_.findIndex ( findSubscriber );\n              \n              while ( INDEX_NOT_FOUND !== index )\n              {\n                  this._subscribersToOneByAny_.splice ( index, DELETE_COUNT );\n                  \n                  index = this._subscribersToOneByAny_.findIndex ( findSubscriber );\n              }\n              \n              if ( undefined !== name && null !== name )\n              {\n                  const publishers: Publishers | undefined = this._emitters_ [ name ];\n    \n                  if ( undefined !== publishers )\n                  {\n                      publishers.forEach ( removePublisher );\n        \n                      if ( NO_LENGTH === publishers.length )\n                          delete this._emitters_ [ name ];\n                  }\n              }\n          }\n          \n          if ( specificMessage && specificSender ) // CASE IV\n              if ( undefined !== name && null !== name )\n              {\n                  const publishers : Publishers | undefined = this._emitters_ [ name ];\n                  \n                  if ( undefined !== publishers )\n                  {\n                      publishers.forEach ( removePublisher );\n                      \n                      if ( NO_LENGTH === publishers.length )\n                          delete this._emitters_ [ name ];\n                  }\n              }\n      }\n    \n   // ========================================================================================================\n   \n   }\n   \n// ***********************************************************************************************************\n","import { NgModule } from '@angular/core';\n\n@NgModule ( { declarations: [],\n              imports     : [],\n              exports     : [] } )\n\nexport class NotificationCenterModule\n{}\n","/*\n * Public API Surface of notification-center\n */\n\nexport * from './lib/notification-center.service';\nexport * from './lib/notification-center.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}