File 2175-Implement-lists-join-2.patch of Package erlang

From c660e30a7dd781f71bed050b20c3e2d0b069e063 Mon Sep 17 00:00:00 2001
From: Jesper Louis Andersen <jesper.louis.andersen@gmail.com>
Date: Sat, 9 Apr 2016 17:17:59 +0200
Subject: [PATCH] Implement lists:join/2

Add a call which works much like string:join/2 but for arbitrary lists. Provide
the function itself, lifted from Haskells Data.List standard library, provide
documentation and provide tests for the function.
---
 lib/stdlib/doc/src/lists.xml    | 15 +++++++++++++++
 lib/stdlib/src/lists.erl        | 15 ++++++++++++++-
 lib/stdlib/test/lists_SUITE.erl | 16 +++++++++++++++-
 3 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/lib/stdlib/doc/src/lists.xml b/lib/stdlib/doc/src/lists.xml
index 89ba523..84e9615 100644
--- a/lib/stdlib/doc/src/lists.xml
+++ b/lib/stdlib/doc/src/lists.xml
@@ -262,6 +262,21 @@ flatmap(Fun, List1) ->
       </desc>
     </func>
     <func>
+      <name name="join" arity="2"/>
+      <fsummary>Insert an element between elements in a list</fsummary>
+      <desc>
+        <p>Inserts <c><anno>Sep</anno></c> between each element in <c><anno>List1</anno></c>. Has no
+          effect on the empty list and on a singleton list. For example:</p>
+        <pre>
+> <input>lists:join(x, [a,b,c]).</input>
+[a,x,b,x,c]
+> <input>lists:join(x, [a]).</input>
+[a]
+> <input>lists:join(x, []).</input>
+[]</pre>
+      </desc>
+    </func>
+    <func>
       <name name="foreach" arity="2"/>
       <fsummary>Apply a function to each element of a list</fsummary>
       <desc>
diff --git a/lib/stdlib/src/lists.erl b/lib/stdlib/src/lists.erl
index 2b4472c..af9d63d 100644
--- a/lib/stdlib/src/lists.erl
+++ b/lib/stdlib/src/lists.erl
@@ -39,7 +39,8 @@
 -export([all/2,any/2,map/2,flatmap/2,foldl/3,foldr/3,filter/2,
 	 partition/2,zf/2,filtermap/2,
 	 mapfoldl/3,mapfoldr/3,foreach/2,takewhile/2,dropwhile/2,splitwith/2,
-	 split/2]).
+	 split/2,
+	 join/2]).
 
 %%% BIFs
 -export([keyfind/3, keymember/3, keysearch/3, member/2, reverse/2]).
@@ -1439,6 +1440,18 @@ split(N, [H|T], R) ->
 split(_, [], _) ->
     badarg.
 
+-spec join(Sep, List1) -> List2 when
+      Sep :: T,
+      List1 :: [T],
+      List2 :: [T],
+      T :: term().
+
+join(_Sep, []) -> [];
+join(Sep, [H|T]) -> [H|join_prepend(Sep, T)].
+
+join_prepend(_Sep, []) -> [];
+join_prepend(Sep, [H|T]) -> [Sep,H|join_prepend(Sep,T)].
+
 %%% =================================================================
 %%% Here follows the implementation of the sort functions.
 %%%
diff --git a/lib/stdlib/test/lists_SUITE.erl b/lib/stdlib/test/lists_SUITE.erl
index b21eb37..f3711c5 100644
--- a/lib/stdlib/test/lists_SUITE.erl
+++ b/lib/stdlib/test/lists_SUITE.erl
@@ -55,6 +55,7 @@
 	 ufunsort_error/1,
 	 zip_unzip/1, zip_unzip3/1, zipwith/1, zipwith3/1,
 	 filter_partition/1, 
+	 join/1,
 	 otp_5939/1, otp_6023/1, otp_6606/1, otp_7230/1,
 	 suffix/1, subtract/1, droplast/1, hof/1]).
 
@@ -119,7 +120,7 @@ groups() ->
      {tickets, [parallel], [otp_5939, otp_6023, otp_6606, otp_7230]},
      {zip, [parallel], [zip_unzip, zip_unzip3, zipwith, zipwith3]},
      {misc, [parallel], [reverse, member, dropwhile, takewhile,
-			 filter_partition, suffix, subtract,
+			 filter_partition, suffix, subtract, join,
 			 hof]}
     ].
 
@@ -2413,6 +2414,19 @@ zipwith3(Config) when is_list(Config) ->
 
     ok.
 
+%% Test lists:join/2
+join(Config) when is_list(Config) ->
+    A = [a,b,c],
+    Sep = x,
+    [a,x,b,x,c] = lists:join(Sep, A),
+
+    B = [b],
+    [b] = lists:join(Sep, B),
+
+    C = [],
+    [] = lists:join(Sep, C),
+    ok.
+
 %% Test lists:filter/2, lists:partition/2.
 filter_partition(Config) when is_list(Config) ->
     F = fun(I) -> I rem 2 =:= 0 end,
-- 
2.1.4

openSUSE Build Service is sponsored by