Skip to content

Commit d78014e

Browse files
committed
Add support for enumerables of enumerables
1 parent b2c2a30 commit d78014e

File tree

2 files changed

+19
-23
lines changed

2 files changed

+19
-23
lines changed

lib/elixir/lib/enum.ex

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ defmodule Enum do
222222
end
223223

224224
@doc """
225-
Given a list of enumerables, concatenate the enumerables into a single list.
225+
Given an enumerable of enumerables, concatenate the enumerables into a single list.
226226
227227
## Examples
228228
@@ -233,8 +233,8 @@ defmodule Enum do
233233
[1,[2],3,4,5,6]
234234
235235
"""
236-
@spec concat([t]) :: t
237-
def concat(enumerables) when is_list(enumerables) do
236+
@spec concat(t) :: t
237+
def concat(enumerables) do
238238
do_concat(enumerables)
239239
end
240240

@@ -261,15 +261,10 @@ defmodule Enum do
261261
do_concat([left, right])
262262
end
263263

264-
defp do_concat(enumerables, acc // [])
265-
266-
defp do_concat([enumerable|enumerables], acc) do
267-
acc = Enumerable.reduce(enumerable, acc, &[&1|&2])
268-
do_concat(enumerables, acc)
269-
end
270-
271-
defp do_concat([], acc) do
272-
:lists.reverse(acc)
264+
defp do_concat(enumerable, acc // []) do
265+
fun = &[&1|&2]
266+
Enumerable.reduce(enumerable, acc, &Enumerable.reduce(&1, &2, fun))
267+
|> :lists.reverse
273268
end
274269

275270
@doc """

lib/elixir/lib/stream.ex

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ defmodule Stream do
132132
@type default :: any
133133

134134
@doc """
135-
Creates a stream that enumerates each enumerable in a list.
135+
Creates a stream that enumerates each enumerable in an enumerable.
136136
137137
## Examples
138138
@@ -141,9 +141,9 @@ defmodule Stream do
141141
[1,2,3,4,5,6,7,8,9]
142142
143143
"""
144-
@spec concat([Enumerable.t]) :: t
144+
@spec concat(Enumerable.t) :: t
145145
def concat(enumerables) do
146-
do_concat(enumerables, &1, &2)
146+
&do_concat(enumerables, &1, &2)
147147
end
148148

149149
@doc """
@@ -155,19 +155,20 @@ defmodule Stream do
155155
iex> Enum.to_list(stream)
156156
[1,2,3,4,5,6]
157157
158+
iex> stream1 = Stream.cycle([1, 2, 3])
159+
iex> stream2 = Stream.cycle([4, 5, 6])
160+
iex> stream = Stream.concat(stream1, stream2)
161+
iex> Enum.take(stream, 6)
162+
[1,2,3,1,2,3]
163+
158164
"""
159165
@spec concat(Enumerable.t, Enumerable.t) :: t
160166
def concat(first, second) do
161-
do_concat([first, second], &1, &2)
162-
end
163-
164-
defp do_concat([enumerable|enumerables], acc, fun) do
165-
acc = Enumerable.reduce(enumerable, acc, fun)
166-
do_concat(enumerables, acc, fun)
167+
&do_concat([first, second], &1, &2)
167168
end
168169

169-
defp do_concat([], acc, _fun) do
170-
acc
170+
defp do_concat(enumerables, acc, fun) do
171+
Enumerable.reduce(enumerables, acc, &Enumerable.reduce(&1, &2, fun))
171172
end
172173

173174
@doc """

0 commit comments

Comments
 (0)