{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/core/signal.ts"],"names":[],"mappings":";;;AAgCA,oCA6BC;AAxDD,MAAa,YAAY;IAAzB;QACE,aAAQ,GAA6B,EAAE,CAAC;IAwB1C,CAAC;IAtBC,QAAQ,CAAC,EAAqB,EAAE,OAAgB,KAAK;QACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAG,IAA2C;QACnD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,WAAW,CAAC,GAAG,IAA2C;QACxD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAE,EAAqB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;CACF;AAzBD,oCAyBC;AAED,SAAgB,YAAY;IAU1B,MAAM,OAAO,GAAG,IAAI,YAAY,EAAqB,CAAC;IAEtD,SAAS,QAAQ,CAAY,EAAqB;QAChD,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7C,CAAC;IAAA,CAAC;IAEF,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAqB,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAQ,UAAU,GAAG,IAAW;YAC5C,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC,CAAA;QACD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAA;IACD,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAqB,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/D,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAA2C,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9F,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,IAA2C,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IACxG,QAAQ,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAEvC,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["type FunctionParameters<T extends (...args: any[]) => any> =\n  T extends (...args: infer P) => any\n    ? P\n    : never;\n\nexport class EventEmitter<CallbackSignature extends (...args: any[]) => any> {\n  handlers: Array<CallbackSignature> = [];\n\n  register(cb: CallbackSignature, once: boolean = false) {\n    this.handlers.push(cb);\n    return this;\n  }\n\n  invoke(...args: FunctionParameters<CallbackSignature>) {\n    this.handlers.forEach((handler) => handler.apply(this, args));\n  }\n\n  invokeAsync(...args: FunctionParameters<CallbackSignature>) {\n    return Promise.all(this.handlers.map((handler) => handler.apply(this, args)));\n  }\n\n  remove (cb: CallbackSignature) {\n    const index = this.handlers.indexOf(cb);\n    this.handlers[index] = this.handlers[this.handlers.length - 1];\n    this.handlers.pop();\n  }\n\n  clear() {\n    this.handlers = [];\n  }\n}\n\nexport function createSignal<CallbackSignature extends (...args: any[]) => void | Promise<any>>()\n  : \n   {\n    once: (cb: CallbackSignature) => void;\n    remove: (cb: CallbackSignature) => void,\n    invoke: (...args: FunctionParameters<CallbackSignature>) => void,\n    invokeAsync: (...args: FunctionParameters<CallbackSignature>) => Promise<any[]>,\n    clear: () => void,\n  } & ((this: any, cb: CallbackSignature) => EventEmitter<CallbackSignature> )\n  {\n  const emitter = new EventEmitter<CallbackSignature>();\n\n  function register(this: any, cb: CallbackSignature): EventEmitter<CallbackSignature> {\n    return emitter.register(cb, this === null);\n  };\n\n  register.once = (cb: CallbackSignature) => {\n    const callback: any = function (...args: any[]) {\n      cb.apply(this, args);\n      emitter.remove(callback);\n    }\n    emitter.register(callback);\n  }\n  register.remove = (cb: CallbackSignature) => emitter.remove(cb)\n  register.invoke = (...args: FunctionParameters<CallbackSignature>) => emitter.invoke(...args);\n  register.invokeAsync = (...args: FunctionParameters<CallbackSignature>) => emitter.invokeAsync(...args);\n  register.clear = () => emitter.clear();\n\n  return register;\n}"]}