UNPKG

25.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/lib/utils/events.ts"],"names":[],"mappings":";;AASA,4BAA4B;AAuD5B,MAAM,aAAa,GAAG,KAAK,CAAC;AAO5B,SAAS,SAAS,CACd,QAA6B,EAC7B,MAAS,EAAE,IAAmC,EAC9C,QAAmC,EACnC,OAAU;IACV,IAAI,CAAC,GAAG,CAAC,EAAE,KAAe,CAAC;IAE3B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAElC,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,EAAE;YAC9E,OAAO,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;SACjC;QAED,KAAK,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE;YAC/C,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;SAC3E;KAEJ;SAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAErE,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3D,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;SAC1D;KACJ;SAAM;QAEH,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;KAC5D;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAKD,SAAS,KAAK,CAAC,MAAqB,EAAE,IAAY,EAAE,QAAmC,EAAE,OAAqB;IAC1G,IAAI,QAAQ,EAAE;QACV,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC/G,IAAI,SAAS,EAAE;YACX,SAAS,CAAC,KAAK,EAAE,CAAC;SACrB;QAED,QAAQ,CAAC,IAAI,CAAC;YACV,QAAQ,EAAG,QAAQ;YACnB,OAAO,EAAI,OAAO;YAClB,GAAG,EAAQ,OAAO,IAAI,GAAG;YACzB,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAG,QAAQ;SACtB,CAAC,CAAC;QAEH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;KACpD;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAKD,SAAS,MAAM,CAAC,MAAiC,EAAE,IAAY,EAAE,QAAmC,EAAE,OAAsB;IACxH,IAAI,CAAC,MAAM,EAAE;QACT,OAAO;KACV;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,SAAwB,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAG/D,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;QAChC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxB,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SACjD;QACD,OAAO;KACV;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAG9B,IAAI,CAAC,QAAQ,EAAE;YACX,MAAM;SACT;QAGD,MAAM,SAAS,GAAmB,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IACI,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC,QAAQ;gBACzC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,SAAS;gBACvC,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,OAAO,EACxC;gBACE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC3B;iBAAM;gBACH,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;gBAC9B,IAAI,SAAS,IAAI,EAAE,SAAS,CAAC,KAAK,KAAK,CAAC,EAAE;oBACtC,OAAO,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAC/B,OAAO,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;iBACjD;aACJ;SACJ;QAGD,IAAI,SAAS,CAAC,MAAM,EAAE;YAClB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;SAC5B;aAAM;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;SACvB;KACJ;IAED,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QAChB,OAAO,MAAM,CAAC;KACjB;AACL,CAAC;AAMD,SAAS,OAAO,CAAC,GAAa,EAAE,IAAY,EAAE,QAAmC,EAAE,KAAe;IAC9F,IAAI,QAAQ,EAAE;QACV,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAmB,CAAC,CAAC,IAAI,CAAC;YAC5C,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClB,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;KAC7B;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAKD,SAAS,UAAU,CAAC,SAAwB,EAAE,IAAY,EAAE,QAA8B,EAAE,IAAW,EAAE,YAA4B,aAAa;IAC9I,IAAI,SAAS,EAAE;QACX,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,MAAM,IAAI,SAAS,EAAE;YACrB,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;SACjC;QACD,IAAI,MAAM,EAAE;YACR,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SAC3B;QACD,IAAI,SAAS,EAAE;YACX,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7C;KACJ;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAOD,SAAS,aAAa,CAAC,MAAsB,EAAE,IAAW;IACtD,IAAI,EAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1F,QAAQ,IAAI,CAAC,MAAM,EAAE;QACjB,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;gBAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;aAAE;YAAC,OAAO;QAC3E,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;gBAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;aAAE;YAAC,OAAO;QAC/E,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;gBAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;aAAE;YAAC,OAAO;QACnF,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;gBAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;aAAE;YAAC,OAAO;QACvF;YAAS,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;gBAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;aAAE;YAAC,OAAO;KACtF;AACL,CAAC;AAKD,MAAa,KAAK;IAmBd,YAAY,IAAY;QAVhB,0BAAqB,GAAG,KAAK,CAAC;QAK9B,wBAAmB,GAAG,KAAK,CAAC;QAMhC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAKD,eAAe;QACX,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACtC,CAAC;IAKD,cAAc;QACV,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAKD,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAKD,IAAI,oBAAoB;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACtC,CAAC;IAKD,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;CACJ;AAzDD,sBAyDC;AAQD,MAAa,eAAe;IAmBxB,IAAY,SAAS;QACjB,OAAO,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;IAUD,EAAE,CAAC,SAA0B,EAAE,QAAuB,EAAE,OAAa,EAAE,QAAiB;QACpF,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IAChB,CAAC;IAKO,UAAU,CAAC,IAAuB,EAAE,QAAmC,EAAE,OAAa,EAAE,WAAmB,CAAC,EAAE,SAAyB;QAC3I,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,IAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChF,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,IAAI;YACT,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,QAAQ;SACrB,CAAC,CAAC;QAEH,IAAI,SAAS,EAAE;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;YAC5D,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;SACvC;IACL,CAAC;IAUD,IAAI,CAAC,IAAqB,EAAE,QAAwB,EAAE,OAAa,EAAE,QAAiB;QAElF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAWD,GAAG,CAAC,IAAsB,EAAE,QAAwB,EAAE,OAAa;QAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,OAAO,IAAI,CAAC;SACf;QAED,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3D,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,CAAC,UAAU;SAC7B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAOD,QAAQ,CAAC,GAAoB,EAAE,IAAqB,EAAE,QAAwB,EAAE,QAAiB;QAC7F,IAAI,CAAC,GAAG,EAAE;YACN,OAAO,IAAI,CAAC;SACf;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QAClE,IAAI,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAIhC,IAAI,CAAC,SAAS,EAAE;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9B,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,GAAG;gBAC1B,GAAG,EAAE,GAAG;gBACR,KAAK,EAAE,EAAE;gBACT,EAAE,EAAE,MAAM;gBACV,WAAW,EAAE,WAAW;gBACxB,KAAK,EAAE,CAAC;aACX,CAAC;SACL;QAGD,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAOD,YAAY,CAAC,GAAoB,EAAE,IAAqB,EAAE,QAAwB,EAAE,QAAiB;QAEjG,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACxG,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAMD,aAAa,CAAC,GAAqB,EAAE,IAAsB,EAAE,QAAwB;QACjF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,IAAI,CAAC;SACf;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAItC,IAAI,CAAC,SAAS,EAAE;gBACZ,MAAM;aACT;YAED,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;YACxB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;SAC9B;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAQD,OAAO,CAAC,IAA2B,EAAE,GAAG,IAAW;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,YAAY,KAAK,EAAE;YACvB,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAsB,EAAE,IAAW,EAAE,EAAE;gBACxF,IAAI,EAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;gBAChD,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;oBACZ,IAAI,IAAI,CAAC,oBAAoB,EAAE;wBAC3B,OAAO;qBACV;oBACD,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACf,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;iBACnC;YACL,CAAC,CAAC,CAAC;SACN;aAAM;YACH,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;SAC3D;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA7LD,0CA6LC","sourcesContent":["// Backbone.js 1.2.3\n// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n// Backbone may be freely distributed under the MIT license.\n// For all details and documentation:\n// https://backbonejs.org\n//\n// The Events object is a typesafe conversion of Backbones Events object:\n// https://github.com/jashkenas/backbone/blob/05fde9e201f7e2137796663081105cd6dad12a98/backbone.js#L119-L374\n\nimport * as _ from 'lodash';\n\nexport interface EventCallback extends Function {\n _callback?: Function;\n}\n\ninterface EventListener {\n obj: any;\n objId: number;\n id: number;\n listeningTo: EventListeners;\n count: number;\n}\n\ninterface EventListeners {\n [id: number]: EventListener;\n}\n\ninterface EventHandler {\n callback: EventCallback;\n context: any;\n ctx: any;\n listening: EventListener;\n priority: number;\n}\n\ninterface EventHandlers {\n [name: string]: EventHandler[];\n}\n\nexport interface EventMap {\n [name: string]: EventCallback;\n}\n\ninterface EventIteratee<T, U> {\n (events: U, name: string, callback: Function | undefined, options: T): U;\n}\n\ninterface EventTriggerer {\n (events: EventHandler[], args: any[]): void;\n}\n\ninterface OnApiOptions {\n context: any;\n ctx: any;\n listening: any;\n priority: number;\n}\n\ninterface OffApiOptions {\n context: any;\n listeners: any;\n}\n\n// Regular expression used to split event strings.\nconst eventSplitter = /\\s+/;\n\n/**\n * Iterates over the standard `event, callback` (as well as the fancy multiple\n * space-separated events `\"change blur\", callback` and jQuery-style event\n * maps `{event: callback}`).\n */\nfunction eventsApi<T, U>(\n iteratee: EventIteratee<T, U>,\n events: U, name: EventMap | string | undefined,\n callback: EventCallback | undefined,\n options: T): U {\n let i = 0, names: string[];\n\n if (name && typeof name === 'object') {\n // Handle event maps.\n if (callback !== void 0 && 'context' in options && options['context'] === void 0) {\n options['context'] = callback;\n }\n\n for (names = _.keys(name); i < names.length ; i++) {\n events = eventsApi(iteratee, events, names[i], name[names[i]], options);\n }\n // tslint:disable-next-line:strict-type-predicates\n } else if (name && typeof name === 'string' && eventSplitter.test(name)) {\n // Handle space separated event names by delegating them individually.\n for (names = name.split(eventSplitter); i < names.length; i++) {\n events = iteratee(events, names[i], callback, options);\n }\n } else {\n // Finally, standard events.\n events = iteratee(events, <any> name, callback, options);\n }\n\n return events;\n}\n\n/**\n * The reducing API that adds a callback to the `events` object.\n */\nfunction onApi(events: EventHandlers, name: string, callback: EventCallback | undefined, options: OnApiOptions): EventHandlers {\n if (callback) {\n const handlers = events[name] || (events[name] = []);\n const context = options.context, ctx = options.ctx, listening = options.listening, priority = options.priority;\n if (listening) {\n listening.count++;\n }\n\n handlers.push({\n callback: callback,\n context: context,\n ctx: context || ctx,\n listening: listening,\n priority: priority\n });\n\n handlers.sort((a, b) => b.priority - a.priority);\n }\n\n return events;\n}\n\n/**\n * The reducing API that removes a callback from the `events` object.\n */\nfunction offApi(events: EventHandlers | undefined, name: string, callback: EventCallback | undefined, options: OffApiOptions): EventHandlers | undefined {\n if (!events) {\n return;\n }\n\n let i = 0, listening: EventListener;\n const context = options.context, listeners = options.listeners;\n\n // Delete all events listeners and \"drop\" events.\n if (!name && !callback && !context) {\n const ids = _.keys(listeners);\n for (; i < ids.length; i++) {\n listening = listeners[ids[i]];\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n return;\n }\n\n const names = name ? [name] : _.keys(events);\n for (; i < names.length; i++) {\n name = names[i];\n const handlers = events[name];\n\n // Bail out if there are no events stored.\n if (!handlers) {\n break;\n }\n\n // Replace events if there are any remaining. Otherwise, clean up.\n const remaining: EventHandler[] = [];\n for (let j = 0; j < handlers.length; j++) {\n const handler = handlers[j];\n if (\n callback && callback !== handler.callback &&\n callback !== handler.callback._callback ||\n context && context !== handler.context\n ) {\n remaining.push(handler);\n } else {\n listening = handler.listening;\n if (listening && --listening.count === 0) {\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n }\n }\n\n // Update tail event if the list has any events. Otherwise, clean up.\n if (remaining.length) {\n events[name] = remaining;\n } else {\n delete events[name];\n }\n }\n\n if (_.size(events)) {\n return events;\n }\n}\n\n/**\n * Reduces the event callbacks into a map of `{event: onceWrapper`.}\n * `offer` unbinds the `onceWrapper` after it has been called.\n */\nfunction onceMap(map: EventMap, name: string, callback: EventCallback | undefined, offer: Function): EventMap {\n if (callback) {\n const once = map[name] = <EventCallback> _.once(function() {\n offer(name, once);\n callback.apply(this, arguments);\n });\n\n once._callback = callback;\n }\n\n return map;\n}\n\n/**\n * Handles triggering the appropriate event callbacks.\n */\nfunction triggerApi(objEvents: EventHandlers, name: string, callback: Function | undefined, args: any[], triggerer: EventTriggerer = triggerEvents): EventHandlers {\n if (objEvents) {\n const events = objEvents[name];\n let allEvents = objEvents['all'];\n if (events && allEvents) {\n allEvents = allEvents.slice();\n }\n if (events) {\n triggerer(events, args);\n }\n if (allEvents) {\n triggerer(allEvents, [name].concat(args));\n }\n }\n\n return objEvents;\n}\n\n/**\n * A difficult-to-believe, but optimized internal dispatch function for\n * triggering events. Tries to keep the usual cases speedy (most internal\n * Backbone events have 3 arguments).\n */\nfunction triggerEvents(events: EventHandler[], args: any[]) {\n let ev: EventHandler, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n switch (args.length) {\n case 0: while (++i < l) { (ev = events[i]).callback.call(ev.ctx); } return;\n case 1: while (++i < l) { (ev = events[i]).callback.call(ev.ctx, a1); } return;\n case 2: while (++i < l) { (ev = events[i]).callback.call(ev.ctx, a1, a2); } return;\n case 3: while (++i < l) { (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); } return;\n default: while (++i < l) { (ev = events[i]).callback.apply(ev.ctx, args); } return;\n }\n}\n\n/**\n * An event object that can be processed with [[Events]].\n */\nexport class Event {\n /**\n * The name of the event.\n */\n private _name: string;\n\n /**\n * Has [[Event.stopPropagation]] been called?\n */\n private _isPropagationStopped = false;\n\n /**\n * Has [[Event.preventDefault]] been called?\n */\n private _isDefaultPrevented = false;\n\n /**\n * Create a new Event instance.\n */\n constructor(name: string) {\n this._name = name;\n }\n\n /**\n * Stop the propagation of this event. Remaining event handlers will not be executed.\n */\n stopPropagation() {\n this._isPropagationStopped = true;\n }\n\n /**\n * Prevent the default action associated with this event from being executed.\n */\n preventDefault() {\n this._isDefaultPrevented = true;\n }\n\n /**\n * Return the event name.\n */\n get name(): string {\n return this._name;\n }\n\n /**\n * Has [[Event.stopPropagation]] been called?\n */\n get isPropagationStopped(): boolean {\n return this._isPropagationStopped;\n }\n\n /**\n * Has [[Event.preventDefault]] been called?\n */\n get isDefaultPrevented(): boolean {\n return this._isDefaultPrevented;\n }\n}\n\n/**\n * A class that provides a custom event channel.\n *\n * You may bind a callback to an event with `on` or remove with `off`;\n * `trigger`-ing an event fires all callbacks in succession.\n */\nexport class EventDispatcher {\n /**\n * Map of all handlers registered with the \"on\" function.\n */\n private _events?: EventHandlers;\n\n /**\n * Map of all objects this instance is listening to.\n */\n private _listeningTo?: EventListeners;\n\n /**\n * Map of all objects that are listening to this instance.\n */\n private _listeners?: EventListeners;\n\n /**\n * A unique id that identifies this instance.\n */\n private get _listenId(): string {\n return this._savedListenId || (this._savedListenId = _.uniqueId('l'));\n }\n private _savedListenId?: string;\n\n /**\n * Bind an event to a `callback` function. Passing `\"all\"` will bind\n * the callback to all events fired.\n */\n on(eventMap: EventMap, context?: any);\n on(eventMap: EventMap, callback?: EventCallback, context?: any, priority?: number);\n on(name: string, callback: EventCallback, context?: any, priority?: number);\n on(nameOrMap: EventMap|string, callback: EventCallback, context?: any, priority?: number) {\n this.internalOn(nameOrMap, callback, context, priority);\n return this;\n }\n\n /**\n * Guard the `listening` argument from the public API.\n */\n private internalOn(name: EventMap | string, callback: EventCallback | undefined, context?: any, priority: number = 0, listening?: EventListener) {\n this._events = eventsApi(onApi, this._events || <EventHandlers> {}, name, callback, {\n context: context,\n ctx: this,\n listening: listening,\n priority: priority\n });\n\n if (listening) {\n const listeners = this._listeners || (this._listeners = {});\n listeners[listening.id] = listening;\n }\n }\n\n /**\n * Bind an event to only be triggered a single time. After the first time\n * the callback is invoked, its listener will be removed. If multiple events\n * are passed in using the space-separated syntax, the handler will fire\n * once for each event, not once for a combination of all events.\n */\n once(eventMap: EventMap, context?: any);\n once(name: string, callback: EventCallback, context?: any, priority?: any);\n once(name: EventMap|string, callback?: EventCallback, context?: any, priority?: number) {\n // Map the event into a `{event: once}` object.\n const events = eventsApi(onceMap, <EventMap> {}, name, callback, _.bind(this.off, this));\n return this.on(events, void 0, context, priority);\n }\n\n /**\n * Remove one or many callbacks. If `context` is null, removes all\n * callbacks with that function. If `callback` is null, removes all\n * callbacks for the event. If `name` is null, removes all bound\n * callbacks for all events.\n */\n off();\n off(eventMap: EventMap | undefined, context?: any);\n off(name: string | undefined, callback?: EventCallback, context?: any);\n off(name?: EventMap|string, callback?: EventCallback, context?: any) {\n if (!this._events) {\n return this;\n }\n\n this._events = eventsApi(offApi, this._events, name, callback, {\n context: context,\n listeners: this._listeners\n });\n\n return this;\n }\n\n /**\n * Inversion-of-control versions of `on`. Tell *this* object to listen to\n * an event in another object... keeping track of what it's listening to\n * for easier unbinding later.\n */\n listenTo(obj: EventDispatcher, name: EventMap|string, callback?: EventCallback, priority?: number) {\n if (!obj) {\n return this;\n }\n const id = obj._listenId;\n const listeningTo = this._listeningTo || (this._listeningTo = {});\n let listening = listeningTo[id];\n\n // This object is not listening to any other events on `obj` yet.\n // Setup the necessary references to track the listening callbacks.\n if (!listening) {\n const thisId = this._listenId;\n listening = listeningTo[id] = {\n obj: obj,\n objId: id,\n id: thisId,\n listeningTo: listeningTo,\n count: 0\n };\n }\n\n // Bind callbacks on obj, and keep track of them on listening.\n obj.internalOn(name, callback, this, priority, listening);\n return this;\n }\n\n /**\n * Inversion-of-control versions of `once`.\n */\n listenToOnce(obj: EventDispatcher, eventMap: EventMap);\n listenToOnce(obj: EventDispatcher, name: string, callback: EventCallback, priority?: number);\n listenToOnce(obj: EventDispatcher, name: EventMap|string, callback?: EventCallback, priority?: number) {\n // Map the event into a `{event: once}` object.\n const events = eventsApi(onceMap, <EventMap> {}, name, callback, _.bind(this.stopListening, this, obj));\n return this.listenTo(obj, events, void 0, priority);\n }\n\n /**\n * Tell this object to stop listening to either specific events ... or\n * to every object it's currently listening to.\n */\n stopListening(obj?: EventDispatcher, name?: EventMap|string, callback?: EventCallback) {\n const listeningTo = this._listeningTo;\n if (!listeningTo) {\n return this;\n }\n\n const ids = obj ? [obj._listenId] : _.keys(listeningTo);\n for (let i = 0; i < ids.length; i++) {\n const listening = listeningTo[ids[i]];\n\n // If listening doesn't exist, this object is not currently\n // listening to obj. Break out early.\n if (!listening) {\n break;\n }\n\n listening.obj.off(name, callback, this);\n }\n\n if (_.isEmpty(listeningTo)) {\n this._listeningTo = void 0;\n }\n\n return this;\n }\n\n /**\n * Trigger one or many events, firing all bound callbacks. Callbacks are\n * passed the same arguments as `trigger` is, apart from the event name\n * (unless you're listening on `\"all\"`, which will cause your callback to\n * receive the true name of the event as the first argument).\n */\n trigger(name: Event|EventMap|string, ...args: any[]) {\n if (!this._events) {\n return this;\n }\n\n if (name instanceof Event) {\n triggerApi(this._events, name.name, void 0, [name], (events: EventHandler[], args: any[]) => {\n let ev: EventHandler, i = -1, l = events.length;\n while (++i < l) {\n if (name.isPropagationStopped) {\n return;\n }\n ev = events[i];\n ev.callback.apply(ev.ctx, args);\n }\n });\n } else {\n eventsApi(triggerApi, this._events, name, void 0, args);\n }\n\n return this;\n }\n}\n"]}
\No newline at end of file