@@ -960,6 +960,36 @@ defmodule Keyword do
960
960
:lists . sort ( left ) === :lists . sort ( right )
961
961
end
962
962
963
+ @ doc """
964
+ Intersects two keyword lists, returning a keyword with the common keys.
965
+
966
+ By default, it returns the values of the intersected keys in `keyword2`.
967
+ The keys are returned in the order found in `keyword1`.
968
+
969
+ ## Examples
970
+
971
+ iex> Keyword.intersect([a: 1, b: 2], [b: "b", c: "c"])
972
+ [b: "b"]
973
+
974
+ iex> Keyword.intersect([a: 1, b: 2], [b: 2, c: 3], fn _k, v1, v2 ->
975
+ ...> v1 + v2
976
+ ...> end)
977
+ [b: 4]
978
+
979
+ """
980
+ @ doc since: "1.17.0"
981
+ @ spec intersect ( keyword , keyword , ( key , value , value -> value ) ) :: keyword
982
+ def intersect ( keyword1 , keyword2 , fun \\ fn _key , _v1 , v2 -> v2 end )
983
+
984
+ def intersect ( [ { k , v1 } | keyword1 ] , keyword2 , fun ) do
985
+ case :lists . keyfind ( k , 1 , keyword2 ) do
986
+ { _ , v2 } -> [ { k , fun . ( k , v1 , v2 ) } | intersect ( keyword1 , keyword2 , fun ) ]
987
+ false -> intersect ( keyword1 , keyword2 , fun )
988
+ end
989
+ end
990
+
991
+ def intersect ( [ ] , _keyword2 , _fun ) , do: [ ]
992
+
963
993
@ doc """
964
994
Merges two keyword lists into one.
965
995
0 commit comments