Open jariji opened 3 months ago
Hm, that's quite specialized - what do you think @devmotion ?
circshift
is underappreciated but has many uses when you want to move around items in an array.
For example, suppose you have a list of items [a,b,c,d,e]
in your list and you want to slide d
up a couple places.
using Accessors, AccessorsExtra
julia> x = collect(1:5)
5-element Vector{Int64}:
1
2
3
4
5
julia> @modify(x |> view(_, 2:4)) do y
circshift(y, -2)
end
5-element Vector{Int64}:
1
4
2
3
5
Suppose you want to put 10,20
in the middle of a list. Rotate the list so the middle is at the end, append 10,20
, rotate back.
julia> using Accessors, InverseFunctions
julia> InverseFunctions.inverse(f::Base.Fix2{typeof(circshift)}) = Base.Fix2(circshift, -f.x);
julia> x = [5,6,7,8,9];
julia> modify(x, @o circshift(_, 3)) do y
append!(y, 10:10:20)
end
7-element Vector{Int64}:
5
6
10
20
7
8
9
Sure, it's definitely useful. The only thing is, we don't really have circshift(_, shifts)
in Julia yet (https://github.com/JuliaLang/julia/pull/24990), except with Base.Fix2(circshift, shifts)
. Is that a common use case? If so, I'm not against adding it.
Nice. Is there one for
slide
d
up a couple places
too?
@jariji, do have have any example use cases in mind?
Those were the examples I had, but there might be better ones. I'll see what else I can come up with.
Thanks - it's just that if we defines inverses also for functions with fixed arguments (beyond some basic math functions like we do now) then there might be a lot of functions in Base that could qualify, but most of them will not really come up in use cases for inverse
. We do have setinverse
now to quickly set inverses for more rare cases. So with "less obvious" functions that can be invertible with a fixed argument I'd suggest to wait for actual use cases.
I think the inverse of
circshift(_, shifts)
iscircshift(_, map(-, shifts))
. Would that fit here?