class FloatFieldComparatorImpl<ENTITY, D> 
extends AbstractFieldComparator<ENTITY> 
implements FloatFieldComparator<ENTITY, D> {
    
    private final HasFloatValue<ENTITY, D> field;
    private final boolean reversed;
    
    public FloatFieldComparatorImpl(HasFloatValue<ENTITY, D> field) {
        this(field, false);
    }
    
    FloatFieldComparatorImpl(HasFloatValue<ENTITY, D> field, boolean reversed) {
        this.field    = requireNonNull(field);
        this.reversed = reversed;
    }
    
    @Override
    public HasFloatValue<ENTITY, D> getField() {
        return field;
    }
    
    @Override
    public NullOrder getNullOrder() {
        return NullOrder.NONE;
    }
    
    @Override
    public boolean isReversed() {
        return reversed;
    }
    
    @Override
    public FloatFieldComparatorImpl<ENTITY, D> reversed() {
        return new FloatFieldComparatorImpl<>(field, !reversed);
    }
    
    @Override
    public int compare(ENTITY first, ENTITY second) {<FILL_FUNCTION_BODY>}
    
    @Override
    public int hashCode() {
        return (4049 + Objects.hashCode(this.field.identifier())) * 3109
            + Boolean.hashCode(reversed);
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof FieldComparator)) return false;
        
        @SuppressWarnings("unchecked")
        final FieldComparator<ENTITY> casted =
            (FieldComparator<ENTITY>) obj;
        
        return reversed == casted.isReversed()
            && Objects.equals(
                field.identifier(),
                casted.getField().identifier()
            );
    }
    
    @Override
    public String toString() {
        return "(order by " + field.identifier() + " " +
            (reversed ? "descending" : "ascending") + ")";
    }
    
    private int applyReversed(float compare) {
        if (compare == 0) {
            return 0;
        } else {
            if (reversed) {
                if (compare > 0) {
                    return -1;
                } else {
                    return 1;
                }
            } else {
                if (compare > 0) {
                    return 1;
                } else {
                    return -1;
                }
            }
        }
    }
}

        requireNonNulls(first, second);
        final float a = field.getAsFloat(first);
        final float b = field.getAsFloat(second);
        return applyReversed(Float.compare(a, b));
    
<methods>public Comparator<ENTITY> thenComparing(Comparator<? super ENTITY>) ,public Comparator<ENTITY> thenComparing(Function<? super ENTITY,? extends U>, Comparator<? super U>) ,public Comparator<ENTITY> thenComparing(Function<? super ENTITY,? extends U>) ,public Comparator<ENTITY> thenComparingDouble(ToDoubleFunction<? super ENTITY>) ,public Comparator<ENTITY> thenComparingInt(ToIntFunction<? super ENTITY>) ,public Comparator<ENTITY> thenComparingLong(ToLongFunction<? super ENTITY>) <variables>