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

package it.unimi.dsi.fastutil.booleans;

import java.io.Serializable;
import java.util.Comparator;

public final class BooleanComparators
{
    public static final BooleanComparator NATURAL_COMPARATOR;
    public static final BooleanComparator OPPOSITE_COMPARATOR;
    
    private BooleanComparators() {
    }
    
    public static BooleanComparator oppositeComparator(final BooleanComparator c) {
        if (c instanceof OppositeComparator) {
            return ((OppositeComparator)c).comparator;
        }
        return new OppositeComparator(c);
    }
    
    public static BooleanComparator asBooleanComparator(final Comparator<? super Boolean> c) {
        if (c == null || c instanceof BooleanComparator) {
            return (BooleanComparator)c;
        }
        return new BooleanComparator() {
            @Override
            public int compare(final boolean x, final boolean y) {
                return c.compare(x, y);
            }
            
            @Override
            public int compare(final Boolean x, final Boolean y) {
                return c.compare(x, y);
            }
        };
    }
    
    static {
        NATURAL_COMPARATOR = new NaturalImplicitComparator();
        OPPOSITE_COMPARATOR = new OppositeImplicitComparator();
    }
    
    protected static class NaturalImplicitComparator implements BooleanComparator, Serializable
    {
        private static final long serialVersionUID = 1L;
        
        @Override
        public final int compare(final boolean a, final boolean b) {
            return Boolean.compare(a, b);
        }
        
        @Override
        public BooleanComparator reversed() {
            return BooleanComparators.OPPOSITE_COMPARATOR;
        }
        
        private Object readResolve() {
            return BooleanComparators.NATURAL_COMPARATOR;
        }
    }
    
    protected static class OppositeImplicitComparator implements BooleanComparator, Serializable
    {
        private static final long serialVersionUID = 1L;
        
        @Override
        public final int compare(final boolean a, final boolean b) {
            return -Boolean.compare(a, b);
        }
        
        @Override
        public BooleanComparator reversed() {
            return BooleanComparators.NATURAL_COMPARATOR;
        }
        
        private Object readResolve() {
            return BooleanComparators.OPPOSITE_COMPARATOR;
        }
    }
    
    protected static class OppositeComparator implements BooleanComparator, Serializable
    {
        private static final long serialVersionUID = 1L;
        final BooleanComparator comparator;
        
        protected OppositeComparator(final BooleanComparator c) {
            this.comparator = c;
        }
        
        @Override
        public final int compare(final boolean a, final boolean b) {
            return this.comparator.compare(b, a);
        }
        
        @Override
        public final BooleanComparator reversed() {
            return this.comparator;
        }
    }
}
