Skip to content

Commit

Permalink
also findall
Browse files Browse the repository at this point in the history
  • Loading branch information
aplavin authored Nov 9, 2023
1 parent 2a2ad27 commit df79cc6
Showing 1 changed file with 44 additions and 2 deletions.
46 changes: 44 additions & 2 deletions src/findall.jl
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,50 @@ julia> findall(in(Interval{:open,:closed}(1,6)), y) # (1,6], does not include 1
5:14
```
"""
Base.findall(interval_d::Base.Fix2{typeof(in), <:Interval}, x::AbstractRange) =
searchsorted_interval(x, interval_d.x; rev=step(x) < zero(step(x)))
if VERSION < v"1.11-"
function Base.findall(interval_d::Base.Fix2{typeof(in),Interval{L,R,T}}, x::AbstractRange) where {L,R,T}
isempty(x) && return 1:0

interval = interval_d.x
il, ir = firstindex(x), lastindex(x)
δx = step(x)
a,b = if δx < zero(δx)
rev = findall(in(interval), reverse(x))
isempty(rev) && return rev

a = (il+ir)-last(rev)
b = (il+ir)-first(rev)

a,b
else
lx, rx = first(x), last(x)
l = max(leftendpoint(interval), lx - oneunit(δx))
r = min(rightendpoint(interval), rx + oneunit(δx))

(l > rx || r < lx) && return 1:0

a = il + max(0, round(Int, cld(l-lx, δx)))
a += (a ir && (x[a] == l && L == :open || x[a] < l))

b = min(ir, round(Int, cld(r-lx, δx)) + il)
b -= (b il && (x[b] == r && R == :open || x[b] > r))

a,b
end
# Reversing a range could change sign of values close to zero (cf
# sign of the smallest element in x and reverse(x), where x =
# range(BigFloat(-0.5),stop=BigFloat(1.0),length=10)), or more
# generally push elements in or out of the interval (as can cld),
# so we need to check once again.
a += +(a < ir && x[a] interval) - (il < a && x[a-1] interval)
b += -(il < b && x[b] interval) + (b < ir && x[b+1] interval)

a:b
end
else
Base.findall(interval_d::Base.Fix2{typeof(in), <:Interval}, x::AbstractRange) =
searchsorted_interval(x, interval_d.x; rev=step(x) < zero(step(x)))
end

# We overload Base._findin to avoid an ambiguity that arises with
# Base.findall(interval_d::Base.Fix2{typeof(in),Interval{L,R,T}}, x::AbstractArray)
Expand Down

0 comments on commit df79cc6

Please sign in to comment.