// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.common.util;

import java.util.Comparator;
import java.util.function.Function;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import javax.annotation.Nonnull;
import java.util.List;

public class ListUtil
{
    @Nonnull
    public static <T> List<List<T>> partition(@Nonnull final List<T> list, final int sectionSize) {
        final List<List<T>> sections = new ObjectArrayList<List<T>>();
        for (int i = 0; i < list.size(); i += sectionSize) {
            final int endIndex = Math.min(list.size(), i + sectionSize);
            sections.add(list.subList(i, endIndex));
        }
        return sections;
    }
    
    public static <T> void removeIf(@Nonnull final List<T> list, @Nonnull final Predicate<T> predicate) {
        for (int i = list.size() - 1; i >= 0; --i) {
            if (predicate.test(list.get(i))) {
                list.remove(i);
            }
        }
    }
    
    public static <T, U> void removeIf(@Nonnull final List<T> list, @Nonnull final BiPredicate<T, U> predicate, final U obj) {
        for (int i = list.size() - 1; i >= 0; --i) {
            if (predicate.test(list.get(i), obj)) {
                list.remove(i);
            }
        }
    }
    
    public static <T> boolean emptyOrAllNull(@Nonnull final List<T> list) {
        for (int i = 0; i < list.size(); ++i) {
            final T e = list.get(i);
            if (e != null) {
                return false;
            }
        }
        return true;
    }
    
    public static <T, V> int binarySearch(@Nonnull final List<? extends T> l, @Nonnull final Function<T, V> func, final V key, @Nonnull final Comparator<? super V> c) {
        int low = 0;
        int high = l.size() - 1;
        while (low <= high) {
            final int mid = low + high >>> 1;
            final T midVal = (T)l.get(mid);
            final int cmp = c.compare((Object)func.apply(midVal), (Object)key);
            if (cmp < 0) {
                low = mid + 1;
            }
            else {
                if (cmp <= 0) {
                    return mid;
                }
                high = mid - 1;
            }
        }
        return -(low + 1);
    }
}
