Mercurial > repos > public > sbplib_julia
annotate src/StaticDicts/StaticDicts.jl @ 726:103f61d09a8b feature/static_dict
More documentation
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Wed, 17 Mar 2021 20:21:36 +0100 |
| parents | e5b51c82f83b |
| children | 3e0b0b44868e |
| rev | line source |
|---|---|
|
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 module StaticDicts |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 export StaticDict |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 """ |
|
724
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
6 StaticDict{K,V,N}(NTuple{N,Pair{K,V}}) <: AbstractDict |
|
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
7 |
|
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
8 A static dictionary implementing the interface for an `AbstractDict`. A |
|
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
9 `StaticDict` is fully immutable and after creation no changes can be made. |
|
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 |
|
724
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
11 The immutable nature means that `StaticDict`s can be compared with `==`, in |
|
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
12 constrast to regular `Dict`s or `ImmutableDict`s which can not. (See |
|
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
13 https://github.com/JuliaLang/julia/issues/4648 for details) |
|
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
14 |
|
a789e789e30f
Docstring for StaticDict
Jonatan Werpers <jonatan@werpers.com>
parents:
720
diff
changeset
|
15 Lookups are done by linear search. |
| 726 | 16 |
| 17 Duplicate keys are not allowed and an error will be thrown if they are passed | |
| 18 to the constructor. | |
|
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 """ |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 struct StaticDict{K,V,N} <: AbstractDict{K,V} |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 pairs::NTuple{N,Pair{K,V}} |
|
720
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
22 |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
23 # TBD: Why doesn't `pairs::NTuple{N,Pair{K,V}}` work? |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
24 function StaticDict{K,V,N}(pairs::Tuple) where {K,V,N} |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
25 if !allunique(first.(pairs)) |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
26 throw(ArgumentError("keys must be unique (for now)")) |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
27 end |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
28 |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
29 return new{K,V,N}(pairs) |
|
172c55c4cf2e
Dissalow duplicate keys
Jonatan Werpers <jonatan@werpers.com>
parents:
719
diff
changeset
|
30 end |
|
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 function StaticDict(pairs::Vararg{Pair}) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 K = typejoin(firsttype.(pairs)...) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 V = typejoin(secondtype.(pairs)...) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 N = length(pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 return StaticDict{K,V,N}(pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 function Base.get(d::StaticDict, key, default) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 for p ∈ d.pairs # TBD: Is this the best? Should we use the iterator on `d`? |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 if key == p.first |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 return p.second |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 return default |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
50 Base.iterate(d::StaticDict) = iterate(d.pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 Base.iterate(d::StaticDict, state) = iterate(d.pairs,state) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 Base.length(d::StaticDict) = length(d.pairs) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
54 |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 |
| 726 | 56 """ |
| 57 merge(d1::StaticDict, d2::StaticDict) | |
| 58 | |
| 59 Merge two `StaticDict`. Repeating keys is considered and error. This may | |
| 60 change in a future version. | |
| 61 """ | |
|
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 function Base.merge(d1::StaticDict, d2::StaticDict) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 return StaticDict(d1.pairs..., d2.pairs...) |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
64 end |
|
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
65 |
|
725
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
66 |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
67 """ |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
68 firsttype(::Pair{T1,T2}) |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
69 |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
70 The type of the first element in the pair. |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
71 """ |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
72 firsttype(::Pair{T1,T2}) where {T1,T2} = T1 |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
73 |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
74 """ |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
75 secondtype(::Pair{T1,T2}) |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
76 |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
77 The type of the secondtype element in the pair. |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
78 """ |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
79 secondtype(::Pair{T1,T2}) where {T1,T2} = T2 |
|
e5b51c82f83b
Docstring for pair type functions
Jonatan Werpers <jonatan@werpers.com>
parents:
724
diff
changeset
|
80 |
|
719
2f8c67c5979e
Start adding a StaticDict type
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
81 end # module |
