|
1 ################################# |
|
2 # Tools for working with structs |
|
3 ################################# |
|
4 |
|
5 module StructTools |
|
6 |
|
7 ############## |
|
8 # Our exports |
|
9 ############## |
|
10 |
|
11 export replace, |
|
12 IterableStruct |
|
13 |
|
14 ###################################################### |
|
15 # Replace entries by those given as keyword arguments |
|
16 ###################################################### |
|
17 |
|
18 function replace(base::T; kw...) where T |
|
19 k = keys(kw) |
|
20 T([n ∈ k ? kw[n] : getfield(base, n) for n ∈ fieldnames(T)]...) |
|
21 end |
|
22 |
|
23 ######################################################### |
|
24 # Iteration of structs. |
|
25 # One only needs to make them instance of IterableStruct |
|
26 ######################################################### |
|
27 |
|
28 abstract type IterableStruct end |
|
29 |
|
30 function Base.iterate(s::T) where T <: IterableStruct |
|
31 return Base.iterate(s, (0, fieldnames(T))) |
|
32 end |
|
33 |
|
34 function Base.iterate( |
|
35 s::T, st::Tuple{Integer,NTuple{N,Symbol}} |
|
36 ) where T <: IterableStruct where N |
|
37 (i, k)=st |
|
38 return (i<N ? (getfield(s, i+1), (i+1, k)) : nothing) |
|
39 end |
|
40 |
|
41 end |