1
1
# This file is a part of Julia. License is MIT: https://julialang.org/license
2
2
3
+ if module_name (@__MODULE__ ) === :Base
4
+
3
5
"""
4
6
NamedTuple{names,T}(args::Tuple)
5
7
@@ -24,16 +26,6 @@ function NamedTuple{names,T}(args::Tuple) where {names, T <: Tuple}
24
26
end
25
27
end
26
28
27
- """
28
- NamedTuple{names}(args::Tuple)
29
-
30
- Construct a named tuple with the given `names` (a tuple of Symbols) from a tuple of
31
- values.
32
- """
33
- function NamedTuple {names} (args:: Tuple ) where {names}
34
- NamedTuple {names,typeof(args)} (args)
35
- end
36
-
37
29
"""
38
30
NamedTuple{names}(nt::NamedTuple)
39
31
@@ -50,7 +42,7 @@ function NamedTuple{names}(nt::NamedTuple) where {names}
50
42
end
51
43
end
52
44
53
- NamedTuple () = NamedTuple {(),Tuple{}} (())
45
+ end # if Base
54
46
55
47
length (t:: NamedTuple ) = nfields (t)
56
48
start (t:: NamedTuple ) = 1
@@ -60,6 +52,8 @@ endof(t::NamedTuple) = nfields(t)
60
52
getindex (t:: NamedTuple , i:: Int ) = getfield (t, i)
61
53
getindex (t:: NamedTuple , i:: Symbol ) = getfield (t, i)
62
54
indexed_next (t:: NamedTuple , i:: Int , state) = (getfield (t, i), i+ 1 )
55
+ isempty (:: NamedTuple{()} ) = true
56
+ isempty (:: NamedTuple ) = false
63
57
64
58
convert (:: Type{NamedTuple{names,T}} , nt:: NamedTuple{names,T} ) where {names,T} = nt
65
59
convert (:: Type{NamedTuple{names}} , nt:: NamedTuple{names} ) where {names} = nt
@@ -213,3 +207,32 @@ values(nt::NamedTuple) = Tuple(nt)
213
207
haskey (nt:: NamedTuple , key:: Union{Integer, Symbol} ) = isdefined (nt, key)
214
208
get (nt:: NamedTuple , key:: Union{Integer, Symbol} , default) = haskey (nt, key) ? getfield (nt, key) : default
215
209
get (f:: Callable , nt:: NamedTuple , key:: Union{Integer, Symbol} ) = haskey (nt, key) ? getfield (nt, key) : f ()
210
+
211
+ @pure function diff_names (an:: Tuple{Vararg{Symbol}} , bn:: Tuple{Vararg{Symbol}} )
212
+ names = Symbol[]
213
+ for n in an
214
+ if ! sym_in (n, bn)
215
+ push! (names, n)
216
+ end
217
+ end
218
+ (names... ,)
219
+ end
220
+
221
+ """
222
+ structdiff(a::NamedTuple{an}, b::Union{NamedTuple{bn},Type{NamedTuple{bn}}}) where {an,bn}
223
+
224
+ Construct a copy of named tuple `a`, except with fields that exist in `b` removed.
225
+ `b` can be a named tuple, or a type of the form `NamedTuple{field_names}`.
226
+ """
227
+ function structdiff (a:: NamedTuple{an} , b:: Union{NamedTuple{bn}, Type{NamedTuple{bn}}} ) where {an, bn}
228
+ if @generated
229
+ names = diff_names (an, bn)
230
+ types = Tuple{Any[ fieldtype (a, n) for n in names ]. .. }
231
+ vals = Any[ :(getfield (a, $ (QuoteNode (n)))) for n in names ]
232
+ :( NamedTuple {$names,$types} (($ (vals... ),)) )
233
+ else
234
+ names = diff_names (an, bn)
235
+ types = Tuple{Any[ fieldtype (typeof (a), n) for n in names ]. .. }
236
+ NamedTuple {names,types} (map (n-> getfield (a, n), names))
237
+ end
238
+ end
0 commit comments