|
| 1 | +/** |
| 2 | + * `Impl` is a functor which generates FFI bindings to Node's `EventEmitter` |
| 3 | + * class for any type `t`. This is not inherently type-safe. Type-safety can |
| 4 | + * be achieved by implementing the known `Event.t('a => 'b, t)` types |
| 5 | + */ |
| 6 | +module Impl = (T: {type t;}) => { |
| 7 | + [@bs.send] |
| 8 | + external addListener: (T.t, Event.t('a => 'b, T.t), 'a => 'b) => T.t = |
| 9 | + "addListener"; |
| 10 | + [@bs.send] |
| 11 | + external emit: (T.t, Event.t('a => 'b, T.t), 'a) => bool = "emit"; |
| 12 | + [@bs.get] external errorMonitor: T.t => Js.Types.symbol = "errorMonitor"; |
| 13 | + [@bs.send] |
| 14 | + external eventNames: |
| 15 | + (T.t, Event.t('a => 'b, T.t)) => array(Event.t('a => 'b, T.t)) = |
| 16 | + "eventNames"; |
| 17 | + [@bs.send] external getMaxListeners: T.t => int = "getMaxListeners"; |
| 18 | + [@bs.send] |
| 19 | + external listenerCount: (T.t, Event.t('a => 'b, T.t)) => int = |
| 20 | + "listenerCount"; |
| 21 | + [@bs.send] |
| 22 | + external listeners: (T.t, Event.t('a => 'b, T.t)) => array('a => 'b) = |
| 23 | + "listeners"; |
| 24 | + [@bs.send] |
| 25 | + external on: (T.t, Event.t('a => 'b, T.t), 'a => 'b) => T.t = "on"; |
| 26 | + [@bs.send] |
| 27 | + external once: (T.t, Event.t('a => 'b, T.t), 'a => 'b) => T.t = "once"; |
| 28 | + [@bs.send] |
| 29 | + external off: (T.t, Event.t('a => 'b, T.t), 'a => 'b) => T.t = "off"; |
| 30 | + [@bs.send] |
| 31 | + external prependListener: (T.t, Event.t('a => 'b, T.t), 'a => 'b) => T.t = |
| 32 | + "prependListener"; |
| 33 | + [@bs.send] |
| 34 | + external prependOnceListener: (T.t, Event.t('a => 'b, T.t), 'a => 'b) => T.t = |
| 35 | + "prependOnceListener"; |
| 36 | + [@bs.send] external removeAllListeners: T.t => T.t = "removeAllListeners"; |
| 37 | + [@bs.send] |
| 38 | + external removeListener: (T.t, Event.t('a => 'b, T.t), 'a => 'b) => T.t = |
| 39 | + "removeListener"; |
| 40 | + [@bs.send] external setMaxListeners: (T.t, int) => T.t = "setMaxListeners"; |
| 41 | + |
| 42 | + [@bs.send] |
| 43 | + external onNewListener: |
| 44 | + ( |
| 45 | + T.t, |
| 46 | + [@bs.as "newListener"] _, |
| 47 | + (Event.t('a => 'b, T.t), 'a => 'b) => unit |
| 48 | + ) => |
| 49 | + T.t = |
| 50 | + "on"; |
| 51 | + [@bs.send] |
| 52 | + external onRemoveListener: |
| 53 | + ( |
| 54 | + T.t, |
| 55 | + [@bs.as "removeListener"] _, |
| 56 | + (Event.t('a => 'b, T.t), 'a => 'b) => unit |
| 57 | + ) => |
| 58 | + T.t = |
| 59 | + "on"; |
| 60 | +}; |
| 61 | + |
| 62 | +/** |
| 63 | + * A generative functor that creates a unique type `t` with the `EventEmitter` |
| 64 | + * interface bindings. |
| 65 | +*/ |
| 66 | +module Make = (()) => { |
| 67 | + type t; |
| 68 | + include Impl({ |
| 69 | + type nonrec t = t; |
| 70 | + }); |
| 71 | + [@bs.module "events"] [@bs.new] external make: unit => t = "EventEmitter"; |
| 72 | +}; |
0 commit comments