package tc.oc.commons.bukkit.chat;
import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.command.CommandSender;
import tc.oc.commons.core.chat.Components;
import tc.oc.commons.core.chat.ImmutableComponent;
import tc.oc.commons.core.util.Utils;
public class ListComponent extends ImmutableComponent implements RenderableComponent {
private final Collection<? extends BaseComponent> elements;
private @Nullable BaseComponent expanded;
public ListComponent(Collection<? extends BaseComponent> elements) {
this.elements = elements;
}
public <T> ListComponent(Collection<T> elements, Function<? super T, BaseComponent> mapper) {
this(elements.stream().map(mapper));
}
public ListComponent(Stream<? extends BaseComponent> elements) {
this(elements.collect(Collectors.toList()));
}
public ListComponent(BaseComponent... elements) {
this(Arrays.asList(elements));
}
public Collection<? extends BaseComponent> elements() {
return elements;
}
@Override
public BaseComponent duplicate() {
return new ListComponent(elements);
}
@Override
public BaseComponent render(ComponentRenderContext context, CommandSender viewer) {
if(expanded == null) {
expanded = Components.naturalList(elements);
}
return context.render(expanded, viewer);
}
@Override
protected boolean equals(BaseComponent obj) {
return Utils.equals(ListComponent.class, this, obj, that ->
super.equals(that) &&
elements.equals(that.elements())
);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), elements);
}
}