Skip to content

Commit df35581

Browse files
Add NamedTuple#reverse_merge (#16229)
Co-authored-by: stephann <[email protected]>
1 parent 82bd031 commit df35581

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

spec/std/named_tuple_spec.cr

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,16 @@ describe "NamedTuple" do
503503
NamedTuple.new.merge(NamedTuple.new).should eq(NamedTuple.new)
504504
end
505505

506+
it "does reverse merge with other named tuple" do
507+
a = {one: 1, two: 2, three: 3, four: 4, five: 5, "im \"string": "works"}
508+
b = {two: "Two", three: true, "new one": "ok"}
509+
a.reverse_merge(b).reverse_merge(four: "Four").reverse_merge(NamedTuple.new).should eq({one: 1, two: 2, three: 3, four: 4, five: 5, "new one": "ok", "im \"string": "works"})
510+
end
511+
512+
it "does reverse merge two empty named tuples" do
513+
NamedTuple.new.reverse_merge(NamedTuple.new).should eq(NamedTuple.new)
514+
end
515+
506516
it "does types" do
507517
tuple = {a: 1, b: 'a', c: "hello"}
508518
tuple.class.types.to_s.should eq("{a: Int32, b: Char, c: String}")

src/named_tuple.cr

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,23 @@ struct NamedTuple
340340
{% end %}
341341
end
342342

343+
# Merges two named tuples into one, returning a new named tuple.
344+
# If a key is defined in both tuples, the value and its type are used from **self** (original tuple)
345+
#
346+
# ```
347+
# a = {foo: "Hello", bar: "Old"}
348+
# b = {bar: "New", baz: "Bye"}
349+
# a.reverse_merge(b) # => {foo: "Hello", bar: "Old", baz: "Bye"}
350+
# ```
351+
def reverse_merge(other : NamedTuple)
352+
other.merge(**self)
353+
end
354+
355+
# :ditto:
356+
def reverse_merge(**other)
357+
reverse_merge(other)
358+
end
359+
343360
# Returns a hash value based on this name tuple's size, keys and values.
344361
#
345362
# See also: `Object#hash`.

0 commit comments

Comments
 (0)