File size: 1,074 Bytes
d075dbf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { useEffect } from 'react';

type EventHandler = (data: any) => void;

class NeuralEventBus {
  private listeners: Map<string, EventHandler[]> = new Map();

  on(event: string, handler: EventHandler) {
    if (!this.listeners.has(event)) {
      this.listeners.set(event, []);
    }
    this.listeners.get(event)?.push(handler);
  }

  off(event: string, handler: EventHandler) {
    const handlers = this.listeners.get(event);
    if (handlers) {
      this.listeners.set(event, handlers.filter(h => h !== handler));
    }
  }

  emit(event: string, data: any) {
    const handlers = this.listeners.get(event);
    if (handlers) {
      handlers.forEach(h => h(data));
    }
  }
}

export const neuralEventBus = new NeuralEventBus();

export const emitNeuralEvent = (event: string, data: any) => {
  neuralEventBus.emit(event, data);
};

export const useNeuralEvent = (event: string, handler: EventHandler) => {
  useEffect(() => {
    neuralEventBus.on(event, handler);
    return () => {
      neuralEventBus.off(event, handler);
    };
  }, [event, handler]);
};