Skip to content

Commit 015079a

Browse files
Merge pull request #769 from oscardssmith/os/fix-remake
fix remake when args is a field of the struct
2 parents 32f5308 + 36a6ded commit 015079a

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/remake.jl

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,34 @@ end
3030

3131
function _remake_internal(thing; kwargs...)
3232
T = remaker_of(thing)
33+
named_thing = struct_as_namedtuple(thing)
3334
if :kwargs fieldnames(typeof(thing))
34-
if :kwargs keys(kwargs)
35-
T(; struct_as_namedtuple(thing)..., thing.kwargs..., kwargs...)
35+
if :args fieldnames(typeof(thing))
36+
named_thing = Base.structdiff(named_thing, (;args=()))
37+
if :args keys(kwargs)
38+
k = Base.structdiff(named_thing, (;args=()))
39+
if :kwargs keys(kwargs)
40+
T(; named_thing..., thing.kwargs..., kwargs...)
41+
else
42+
T(; named_thing..., kwargs[:kwargs]...)
43+
end
44+
else
45+
kwargs2 = Base.structdiff((;kwargs...), (;args=()))
46+
if :kwargs keys(kwargs)
47+
T(kwargs[:args]...; named_thing..., thing.kwargs..., kwargs2...)
48+
else
49+
T(kwargs[:args]...; named_thing..., kwargs2[:kwargs]...)
50+
end
51+
end
3652
else
37-
T(; struct_as_namedtuple(thing)..., kwargs[:kwargs]...)
53+
if :kwargs keys(kwargs)
54+
T(; named_thing..., thing.kwargs..., kwargs...)
55+
else
56+
T(; named_thing..., kwargs[:kwargs]...)
57+
end
3858
end
3959
else
40-
T(; struct_as_namedtuple(thing)..., kwargs...)
60+
T(; named_thing..., kwargs...)
4161
end
4262
end
4363

test/remake_tests.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,3 +284,14 @@ newprob = remake(sdeprob; g = noise2!)
284284
@test newprob.f isa SDEFunction
285285
tmp = newprob.g([0.0, 0.0, 0.0], [1.0, 2.0, 3.0], nothing, 0.0)
286286
@test tmp[0.2, 0.4, 0.6] atol=1e-6
287+
288+
struct Remake_Test1
289+
p
290+
args
291+
kwargs
292+
end
293+
Remake_Test1(args...; p, kwargs...) = Remake_Test1(p, args, kwargs)
294+
a = Remake_Test1(p=1)
295+
@test @inferred remake(a, p=2) == Remake_Test1(p=2)
296+
@test @inferred remake(a, args=1) == Remake_Test1(1, p=1)
297+
@test @inferred remake(a, kwargs=(;a=1)) == Remake_Test1(p=1, a=1)

0 commit comments

Comments
 (0)