Skip to content

Base.intersect doesn't work for resumable functions #107

Description

@MarkNahabedian

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions