summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/elixir/lib/stream.ex6
-rw-r--r--lib/elixir/test/elixir/stream_test.exs8
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/elixir/lib/stream.ex b/lib/elixir/lib/stream.ex
index ae7f22cc2..e797c0239 100644
--- a/lib/elixir/lib/stream.ex
+++ b/lib/elixir/lib/stream.ex
@@ -1155,6 +1155,10 @@ defmodule Stream do
@spec cycle(Enumerable.t) :: Enumerable.t
def cycle(enumerable)
+ def cycle([]) do
+ raise ArgumentError, "cannot cycle over empty enumerable"
+ end
+
def cycle(enumerable) when is_list(enumerable) do
unfold {enumerable, enumerable}, fn
{source, [h | t]} -> {h, {source, t}}
@@ -1185,6 +1189,8 @@ defmodule Stream do
{:stream_cycle, acc} ->
{:halted, acc}
else
+ {state, []} when state in [:done, :halted] ->
+ raise ArgumentError, "cannot cycle over empty enumerable"
{state, acc} when state in [:done, :halted] ->
do_cycle(cycle, cycle, {:cont, acc})
{:suspended, acc, continuation} ->
diff --git a/lib/elixir/test/elixir/stream_test.exs b/lib/elixir/test/elixir/stream_test.exs
index 69d7f9efc..4dd905e30 100644
--- a/lib/elixir/test/elixir/stream_test.exs
+++ b/lib/elixir/test/elixir/stream_test.exs
@@ -168,6 +168,14 @@ defmodule StreamTest do
stream = Stream.cycle([1, 2, 3])
assert is_function(stream)
+ assert_raise ArgumentError, "cannot cycle over empty enumerable", fn ->
+ Stream.cycle([])
+ end
+
+ assert_raise ArgumentError, "cannot cycle over empty enumerable", fn ->
+ Stream.cycle(%{}) |> Enum.to_list()
+ end
+
assert Stream.cycle([1, 2, 3]) |> Stream.take(5) |> Enum.to_list == [1, 2, 3, 1, 2]
assert Enum.take(stream, 5) == [1, 2, 3, 1, 2]
end