Slot.java

package com.cloudforgeci.api.core;

import com.cloudforgeci.api.interfaces.BaseSlot;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;

public final class Slot<T> implements BaseSlot<T> {
    private T value;
    private final List<Consumer<T>> waiters = new ArrayList<>();

    @Override
    public void set(T v) {
        if (value != null) return;
        value = v;
        for (var w : List.copyOf(waiters)) w.accept(v);
        waiters.clear();
    }
    @Override
    public Optional<T> get() { return Optional.ofNullable(value); }

    @Override
    public void onSet(java.util.function.Consumer<T> c) { if (value != null) c.accept(value); else waiters.add(c); }
}