From 327a0de00d1e5a6031b6a1003b6aa72f25206e45 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 12 Jan 2020 21:28:54 -0800 Subject: [PATCH] Add Experimental.mergewith!! --- src/BangBang.jl | 1 + src/base.jl | 18 +++--------------- src/experimental.jl | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 src/experimental.jl diff --git a/src/BangBang.jl b/src/BangBang.jl index a80948e0..c76818a6 100644 --- a/src/BangBang.jl +++ b/src/BangBang.jl @@ -53,6 +53,7 @@ using .NoBang: Empty, ImmutableContainer, SingletonVector, singletonof include("core.jl") include("base.jl") include("linearalgebra.jl") +include("experimental.jl") include("initials.jl") include("macro.jl") include("dataframes_impl.jl") diff --git a/src/base.jl b/src/base.jl index 68db5870..4c67bea8 100644 --- a/src/base.jl +++ b/src/base.jl @@ -297,24 +297,12 @@ Dict{Symbol,Float64} with 1 entry: :a => 1.5 ``` """ -merge!!(dict::Union{AbstractDict,NamedTuple,Empty}, others...) = - merge!!(right, dict, others...) - -merge!!(combine, dict, other) = - foldl(pairs(other); init=dict) do dict, (k, v2) - v1 = get(dict, k, _NoValue()) - setindex!!(dict, v1 isa _NoValue ? v2 : combine(v1, v2), k) - end - -merge!!(combine, dict, others...) = - foldl(others; init=dict) do dict, other - merge!!(combine, dict, other) - end +merge!!(dict, others...) = merge!!(right, dict, others...) +merge!!(combine::Base.Callable, dict, others...) = + Experimental.mergewith!!(combine, dict, others...) right(_, x) = x -struct _NoValue end - #= """ splice!!(sequence, i, [replacement]) -> (sequence′, item) diff --git a/src/experimental.jl b/src/experimental.jl new file mode 100644 index 00000000..ea4959ae --- /dev/null +++ b/src/experimental.jl @@ -0,0 +1,37 @@ +module Experimental + +export mergewith!! + +using ..BangBang: setindex!! + +struct _NoValue end + +""" + mergewith!!(combine, dict, others...) -> dict′ + mergewith!!(combine) + +Like `merge!!(combine, dict, others...)` but `combine` does not have +to be a `Function`. + +The curried form `mergewith!!(combine)` returns the function +`(args...) -> mergewith!!(combine, args...)`. + +See also: +[Add mergewith[!](combine, dicts...) by tkf · Pull Request #34296 · JuliaLang/julia](https://github.com/JuliaLang/julia/pull/34296) +""" +mergewith!! + +mergewith!!(combine, dict, other) = + foldl(pairs(other); init=dict) do dict, (k, v2) + v1 = get(dict, k, _NoValue()) + setindex!!(dict, v1 isa _NoValue ? v2 : combine(v1, v2), k) + end + +mergewith!!(combine, dict, others...) = + foldl(others; init=dict) do dict, other + mergewith!!(combine, dict, other) + end + +mergewith!!(combine) = (args...) -> mergewith!!(combine, args...) + +end # module