// Path: src/main/java/io/taciturn/Utility.java
// public static <Item> ClassUtility<Item> $(Class<Item> object) {
//     return new ClassUtility<>(object);
// }


import java.util.function.Predicate;
import static io.taciturn.Utility.$;

    public ComparableUtility<Item> mustBeBetween(Item lower, Item upper) {
        return mustBe(isBetweenPredicate(lower, upper), createBetweenExpectedMessage(lower, upper));
    }

    public ComparableUtility<Item> mustBeBetween(ComparableUtility<Item> lower, ComparableUtility<Item> upper) {
        return mustBe(isBetweenPredicate(lower, upper), createBetweenExpectedMessage(lower, upper));
    }

    public ComparableUtility<Item> mustBeGreaterThan(Item lower) {
        return mustBe(isGreaterThanPredicate(lower), createGreaterThanExpectedMessage(lower));
    }

    public ComparableUtility<Item> mustBeGreaterThanOrEqualTo(Item lower) {
        return mustBe(isGreaterThanOrEqualToPredicate(lower), createGreaterThanOrEqualToExpectedMessage(lower));
    }

    public ComparableUtility<Item> mustBeLessThan(Item upper) {
        return mustBe(isLessThanPredicate(upper), createLessThanExpectedMessage(upper));
    }

    public ComparableUtility<Item> mustBeLessThanOrEqualTo(Item upper) {
        return mustBe(isLessThanOrEqualToPredicate(upper), createLessThanOrEqualToExpectedMessage(upper));
    }

    public ComparableUtility<Item> mustBeEqualTo(Item upper) {
        return mustBe(isEqualToPredicate(upper), createEqualToExpectedMessage(upper));
    }

    public static <T extends Comparable<T>> Predicate<T> isBetweenPredicate(T lower, T upper) {
// Path: src/main/java/io/taciturn/Utility.java
// public static <Item> ClassUtility<Item> $(Class<Item> object) {
//     return new ClassUtility<>(object);
// }


// Path: src/main/java/io/taciturn/utility/ComparableUtility.java
import java.util.function.Predicate;
import static io.taciturn.Utility.$;


    public ComparableUtility<Item> mustBeBetween(Item lower, Item upper) {
        return mustBe(isBetweenPredicate(lower, upper), createBetweenExpectedMessage(lower, upper));
    }

    public ComparableUtility<Item> mustBeBetween(ComparableUtility<Item> lower, ComparableUtility<Item> upper) {
        return mustBe(isBetweenPredicate(lower, upper), createBetweenExpectedMessage(lower, upper));
    }

    public ComparableUtility<Item> mustBeGreaterThan(Item lower) {
        return mustBe(isGreaterThanPredicate(lower), createGreaterThanExpectedMessage(lower));
    }

    public ComparableUtility<Item> mustBeGreaterThanOrEqualTo(Item lower) {
        return mustBe(isGreaterThanOrEqualToPredicate(lower), createGreaterThanOrEqualToExpectedMessage(lower));
    }

    public ComparableUtility<Item> mustBeLessThan(Item upper) {
        return mustBe(isLessThanPredicate(upper), createLessThanExpectedMessage(upper));
    }

    public ComparableUtility<Item> mustBeLessThanOrEqualTo(Item upper) {
        return mustBe(isLessThanOrEqualToPredicate(upper), createLessThanOrEqualToExpectedMessage(upper));
    }

    public ComparableUtility<Item> mustBeEqualTo(Item upper) {
        return mustBe(isEqualToPredicate(upper), createEqualToExpectedMessage(upper));
    }

    public static <T extends Comparable<T>> Predicate<T> isBetweenPredicate(T lower, T upper) {
        $(lower).mustNotBeNull();