-
Notifications
You must be signed in to change notification settings - Fork 31
Open
Description
Hi everyone,
I have a project where I need to remove listeners from many observables.
Sometimes it's about removing all, sometimes about removing all except the first one.
I don't want to keep track of all the observer functions so I wondered whether it was possible to remove the listeners by index.
Hence I came up with the follwing code.
export off!, nlistener
nlistener(@nospecialize(o::Observable)) = length(Observables.listeners(o))
function off!(@nospecialize(o::Observables.AbstractObservable), index::Union{AbstractRange{<:Integer}, Vector{<:Integer}})
allunique(index) || (@info("All indices must be distinct"); return BitVector(zeros(len)))
len = length(index)
callbacks = Observables.listeners(o)
success = BitVector(zeros(len))
for (i, n) in enumerate(reverse(sort(index)))
if 0 < n <= length(callbacks)
for g in Observables.removehandler_callbacks
g(observable, callbacks[n])
end
deleteat!(callbacks, n)
success[len - i + 1] = true
end
end
success
end
off!(@nospecialize(o::Observables.AbstractObservable), index::Integer) = off!(o, [index])[1]
off!(@nospecialize(o::Observables.AbstractObservable)) = off!(o, 1:length(Observables.listeners(o)))Does that look like something you'd like to integrate in Observables?
If so, please let me know. I'd be happy to submit a PR.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels