Closed nessdoor closed 7 months ago
Good catch. The zero arities don't make much sense to me, but I'd rather go a deprecation route than fixing them. Perhaps we can introduce a couple of new predicates, say, chronological?
and reverse-chronological?
with the <=
semantics?
@nessdoor thoughts on https://github.com/dm3/clojure.java-time/pull/99?
I think it's fine to deprecate and replace, if the current name doesn't make sense for the new semantics. But I have no experience with public library design, so I can't provide any further suggestions on that.
I will provide more feedback under the PR directly, so that we don't disperse things.
Oh, right, would it be impractical to make all affected types implement ordering as part of their interfaces? Because the problem could be entirely side-stepped, at that point.
There's another way that not-after?
is broken, and that's when given more than two arguments.
(jt/not-after? (jt/local-date 2023 11 14) (jt/local-date 2023 11 12) (jt/local-date 2023 11 13))
;=> true
It seems that not-after?
really only works with exactly two arguments.
(jt/not-after? (jt/local-date 2023 11 14) (jt/local-date 2023 11 12))
;=> false
This is because (after? a b c)
is really (and (after? a b) (after? b c))
and simply inverting that changes it to (or (not (after? a b)) (not (after? b c)))
which is not the same.
The same issue exists with not-before?
The documentation for
not-after?
recites:The documentation for
before?
states:This seems to imply that
not-after?
should be semantically equivalent to<=
, but it is not when invoked like:If semantically equivalent, this s-expression should have returned
true
. Note thatbefore?
is, in fact, semantically equivalent to<
:This issue seems to be a consequence of how
not-after?
is defined as the complement ofafter?
, as the latter is consistent with the behavior of>
:The same applies to
not-before?
.Not sure if this is intended behavior or not, but I found it rather confusing. In addition, when one of these functions is
apply
-ed, the client code is forced to explicitly check for the arity 1 case and override the result of the evaluation, like so: