package net.minestom.server.utils.clone; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.IntFunction; /** * Convenient interface to deep-copy single object or collections. *

* Most of the methods require object to implement the {@link PublicCloneable} interface. */ public final class CloneUtils { @Nullable public static > T optionalClone(@Nullable T object) { return object != null ? object.clone() : null; } @NotNull public static > CopyOnWriteArrayList cloneCopyOnWriteArrayList(@NotNull List list) { CopyOnWriteArrayList result = new CopyOnWriteArrayList<>(); for (T element : list) { result.add(element.clone()); } return result; } public static > T[] cloneArray(@NotNull T[] array, IntFunction arraySupplier) { T[] result = arraySupplier.apply(array.length); for (int i = 0; i < result.length; i++) { result[i] = optionalClone(array[i]); } return result; } }