/ Data / src / dictview.jl
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))