ITADN

Base.intersect doesn't work for resumable functions

#107OpenMarkNahabedian 创建于 2024-10-27
M
MarkNahabediancommented
Though Base.union works with the iterators produced by @resumable, Base.intersect does not: ``` using ResumableFunctions @resumable function onetwothree() @yield 1 @yield 2 @yield 3 end intersect(onetwothree(), [2]) ERROR: @resumable function has stopped! Stacktrace: [1] error(s::String) @ Base .\error.jl:35 ``` The below suggestion is untested. First we need a common supertype for all resumable functions: ``` abstract type ResumableFunction end ``` The `@resumable` macro would need to be modified such that the struct it defines inherits from that supertype. Then, something like ``` function Base.intersect(iter1::ResumableFunction, iters...) found = Dict() for v in iter1 found[v] = 1 end for iter in iters for v in iter if haskey(found, v) found[v] += 1 end end end need = 1 + length(iters) for (v, count) in found if count != need end end keys(found) end ``` This doesn't quite adhere to the documentation for `Base.intersect`, which says that the result should be of the same type as the first argument. If the first argument is an iterator then presumably returning an iterable is sufficient. In any case, its an improvement over `Base.intersect` not workiing if the first argument is a ResumableFunctions iterator.
1 条评论