Flux.jl/src/tracker/idset.jl

26 lines
693 B
Julia
Raw Normal View History

2018-07-09 15:57:44 +00:00
struct IdSet{T} <: AbstractSet{T}
2018-07-12 19:56:51 +00:00
dict::IdDict{T,Nothing}
IdSet{T}() where T = new(IdDict{T,Nothing}())
2018-07-09 15:57:44 +00:00
end
Base.eltype{T}(::IdSet{T}) = T
IdSet() = IdSet{Any}()
Base.push!{T}(s::IdSet{T}, x::T) = (s.dict[x] = nothing; s)
Base.delete!{T}(s::IdSet{T}, x::T) = (delete!(s.dict, x); s)
Base.in(x, s::IdSet) = haskey(s.dict, x)
(::Type{IdSet{T}}){T}(xs) = push!(IdSet{T}(), xs...)
IdSet(xs) = IdSet{eltype(xs)}(xs)
Base.collect(s::IdSet) = Base.collect(keys(s.dict))
Base.similar(s::IdSet, T::Type) = IdSet{T}()
@forward IdSet.dict Base.length
Base.start(s::IdSet) = start(keys(s.dict))
Base.next(s::IdSet, st) = next(keys(s.dict), st)
Base.done(s::IdSet, st) = done(keys(s.dict), st)