// Path: src/main/java/com/openmodloader/api/event/EventContext.java
// public class EventContext {
// }
// 
// Path: src/main/java/com/openmodloader/api/event/EventMap.java
// public class EventMap {
//     private final ImmutableMap<Class<?>, Collection<Listener<?>>> events;
// 
//     private EventMap(ImmutableMap<Class<?>, Collection<Listener<?>>> events) {
//         this.events = events;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <E extends IEvent> Stream<IEventListener<E>> getListeners(IEventTarget<E> target) {
//         Collection<Listener<?>> listeners = this.events.get(target.getType());
//         if (listeners == null) {
//             return Stream.empty();
//         }
// 
//         return listeners.stream()
//                 .filter(l -> l.canReceive(target))
//                 .map(l -> (IEventListener<E>) l.listener);
//     }
// 
//     public static Builder builder() {
//         return new Builder();
//     }
// 
//     public static class Builder {
//         private final Map<Class<?>, Collection<Listener<?>>> events = new HashMap<>();
// 
//         private Builder() {
//         }
// 
//         public <E extends IEvent> Builder put(IEventTarget<E> target, IEventListener<E> listener) {
//             Class<E> targetType = target.getType();
//             Collection<Listener<?>> listeners = this.events.computeIfAbsent(targetType, t -> new ArrayList<>());
//             listeners.add(new Listener<>(target, listener));
//             return this;
//         }
// 
//         public EventMap build() {
//             return new EventMap(ImmutableMap.copyOf(this.events));
//         }
//     }
// 
//     private static class Listener<E extends IEvent> {
//         private final IEventTarget<E> target;
//         private final IEventListener<E> listener;
// 
//         private Listener(IEventTarget<E> target, IEventListener<E> listener) {
//             this.target = target;
//             this.listener = listener;
//         }
// 
//         boolean canReceive(IEventTarget<?> target) {
//             return this.target.canReceive(target);
//         }
//     }
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEvent.java
// public interface IEvent {
//     IEventTarget<?> makeTarget();
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEventDispatcher.java
// public interface IEventDispatcher {
//     <E extends IEvent> void dispatch(E event);
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEventListener.java
// @FunctionalInterface
// public interface IEventListener<E extends IEvent> {
//     void handle(E event, EventContext context);
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEventTarget.java
// public interface IEventTarget<E extends IEvent> {
//     Class<E> getType();
// 
//     boolean canReceive(IEventTarget<?> target);
// }


import com.openmodloader.api.event.EventContext;
import com.openmodloader.api.event.EventMap;
import com.openmodloader.api.event.IEvent;
import com.openmodloader.api.event.IEventDispatcher;
import com.openmodloader.api.event.IEventListener;
import com.openmodloader.api.event.IEventTarget;
import java.util.stream.Stream;
package com.openmodloader.core.event;



public class ImmutableEventDispatcher implements IEventDispatcher {
    private final EventMap events;

    public ImmutableEventDispatcher(EventMap events) {
        this.events = events;
    }

// Path: src/main/java/com/openmodloader/api/event/EventContext.java
// public class EventContext {
// }
// 
// Path: src/main/java/com/openmodloader/api/event/EventMap.java
// public class EventMap {
//     private final ImmutableMap<Class<?>, Collection<Listener<?>>> events;
// 
//     private EventMap(ImmutableMap<Class<?>, Collection<Listener<?>>> events) {
//         this.events = events;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public <E extends IEvent> Stream<IEventListener<E>> getListeners(IEventTarget<E> target) {
//         Collection<Listener<?>> listeners = this.events.get(target.getType());
//         if (listeners == null) {
//             return Stream.empty();
//         }
// 
//         return listeners.stream()
//                 .filter(l -> l.canReceive(target))
//                 .map(l -> (IEventListener<E>) l.listener);
//     }
// 
//     public static Builder builder() {
//         return new Builder();
//     }
// 
//     public static class Builder {
//         private final Map<Class<?>, Collection<Listener<?>>> events = new HashMap<>();
// 
//         private Builder() {
//         }
// 
//         public <E extends IEvent> Builder put(IEventTarget<E> target, IEventListener<E> listener) {
//             Class<E> targetType = target.getType();
//             Collection<Listener<?>> listeners = this.events.computeIfAbsent(targetType, t -> new ArrayList<>());
//             listeners.add(new Listener<>(target, listener));
//             return this;
//         }
// 
//         public EventMap build() {
//             return new EventMap(ImmutableMap.copyOf(this.events));
//         }
//     }
// 
//     private static class Listener<E extends IEvent> {
//         private final IEventTarget<E> target;
//         private final IEventListener<E> listener;
// 
//         private Listener(IEventTarget<E> target, IEventListener<E> listener) {
//             this.target = target;
//             this.listener = listener;
//         }
// 
//         boolean canReceive(IEventTarget<?> target) {
//             return this.target.canReceive(target);
//         }
//     }
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEvent.java
// public interface IEvent {
//     IEventTarget<?> makeTarget();
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEventDispatcher.java
// public interface IEventDispatcher {
//     <E extends IEvent> void dispatch(E event);
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEventListener.java
// @FunctionalInterface
// public interface IEventListener<E extends IEvent> {
//     void handle(E event, EventContext context);
// }
// 
// Path: src/main/java/com/openmodloader/api/event/IEventTarget.java
// public interface IEventTarget<E extends IEvent> {
//     Class<E> getType();
// 
//     boolean canReceive(IEventTarget<?> target);
// }


// Path: src/main/java/com/openmodloader/core/event/ImmutableEventDispatcher.java
import com.openmodloader.api.event.EventContext;
import com.openmodloader.api.event.EventMap;
import com.openmodloader.api.event.IEvent;
import com.openmodloader.api.event.IEventDispatcher;
import com.openmodloader.api.event.IEventListener;
import com.openmodloader.api.event.IEventTarget;
import java.util.stream.Stream;

package com.openmodloader.core.event;



public class ImmutableEventDispatcher implements IEventDispatcher {
    private final EventMap events;

    public ImmutableEventDispatcher(EventMap events) {
        this.events = events;
    }

    @Override