{"version":3,"file":"signal.mjs","sources":["../../../../src/core/signal.ts"],"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}"],"names":[],"mappings":";MAKa,YAAY,CAAA;IACvB,QAAQ,GAA6B,EAAE,CAAC;AAExC,IAAA,QAAQ,CAAC,EAAqB,EAAE,IAAA,GAAgB,KAAK,EAAA;AACnD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,QAAA,OAAO,IAAI,CAAC;KACb;IAED,MAAM,CAAC,GAAG,IAA2C,EAAA;AACnD,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;KAC/D;IAED,WAAW,CAAC,GAAG,IAA2C,EAAA;QACxD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;KAC/E;AAED,IAAA,MAAM,CAAE,EAAqB,EAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;KACrB;IAED,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;KACpB;AACF,CAAA;SAEe,YAAY,GAAA;AAU1B,IAAA,MAAM,OAAO,GAAG,IAAI,YAAY,EAAqB,CAAC;IAEtD,SAAS,QAAQ,CAAY,EAAqB,EAAA;QAChD,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC;KAC5C;AAED,IAAA,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAqB,KAAI;AACxC,QAAA,MAAM,QAAQ,GAAQ,UAAU,GAAG,IAAW,EAAA;AAC5C,YAAA,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrB,YAAA,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC3B,SAAC,CAAA;AACD,QAAA,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC7B,KAAC,CAAA;AACD,IAAA,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAC/D,IAAA,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAA2C,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9F,IAAA,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,IAA2C,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IACxG,QAAQ,CAAC,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AAEvC,IAAA,OAAO,QAAQ,CAAC;AAClB;;;;"}