dictview.jl
1 @doc """A view into a dictionary (a subset of keys). 2 3 $(FIELDS) 4 """ 5 @kwdef struct DictView6{K,D} 6 d::D 7 keys::Set{K} 8 end 9 DictView = DictView6 10 dictview(d, keys) = DictView(d, Set(keys)) 11 12 @doc """Macro for checking if a key exists in a `DictView`. 13 14 This macro checks if a given key is present in the `keys` field of the `DictView` (`d`). 15 """ 16 macro checkkey(k) 17 k = esc(k) 18 quote 19 $k ∈ $(esc(:d)).keys || throw(KeyError($k)) 20 end 21 end 22 Base.getindex(d::DictView, k) = begin 23 @checkkey k 24 getindex(d.d, k) 25 end 26 Base.setindex!(d::DictView, k) = begin 27 @checkkey k 28 setindex!(d.d, k) 29 end 30 Base.delete!(d::DictView, k) = begin 31 @checkkey k 32 delete!(d.d, k) 33 end 34 Base.empty!(d::DictView) = begin 35 for k in d.keys 36 delete!(d.d, k) 37 end 38 end 39 Base.isempty(d::DictView) = isempty(d.keys) 40 Base.length(d::DictView) = length(d.keys) 41 Base.keys(d::DictView) = d.keys 42 Base.values(d::DictView) = [d.d[k] for k in d.keys] 43 Base.haskey(d::DictView, k) = k in d.keys 44 Base.get(d::DictView, k, def) = 45 if k in d.keys 46 getindex(d.d, k) 47 else 48 def 49 end 50 @kwdef struct DictViewIterator2 51 current::Vector{Int} = [2] 52 stop::Int 53 end 54 Base.iterate(d::DictView) = Iterators.peel((k, d.d[k]) for k in d.keys) 55 Base.iterate(::DictView, state) = Iterators.peel(state) 56 Base.filter(f, d::DictView) = Dict(p for p in d if f(p))