Skip to content

Commit a2c6630

Browse files
committed
Add Stream.repeatedly
1 parent 8c3c0a9 commit a2c6630

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

lib/elixir/lib/stream.ex

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,26 @@ defmodule Stream do
284284
end
285285

286286

287+
@doc """
288+
Returns a stream generated by calling `generator_fun` repeatedly.
289+
290+
## Examples
291+
292+
iex> Stream.repeatedly(function(:random.uniform/0)) |> Enum.take(3)
293+
[0.4435846174457203, 0.7230402056221108, 0.94581636451987]
294+
295+
"""
296+
@spec repeatedly(( -> element)) :: Lazy.t
297+
def repeatedly(generator_fun)
298+
when is_function(generator_fun, 0) do
299+
do_repeatedly(generator_fun, &1, &2)
300+
end
301+
302+
defp do_repeatedly(generator_fun, acc, fun) do
303+
do_repeatedly(generator_fun, fun.(generator_fun.(), acc), fun)
304+
end
305+
306+
287307
@doc """
288308
Lazily takes the next `n` items from the enumerable and stops
289309
enumeration.

lib/elixir/test/elixir/stream_test.exs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ defmodule StreamTest do
7474
assert Enum.to_list(stream) == [1,3]
7575
end
7676

77+
test :repeatedly do
78+
stream = Stream.repeatedly(fn -> 1 end)
79+
assert Enum.take(stream, 5) == [1,1,1,1,1]
80+
stream = Stream.repeatedly(function(:random.uniform/0))
81+
[r1,r2] = Enum.take(stream, 2)
82+
assert r1 != r2
83+
end
84+
7785
test :take do
7886
stream = Stream.take(1..1000, 5)
7987
assert is_lazy(stream)

0 commit comments

Comments
 (0)