Streams: Lazy Enumerables
Learn about streams and how to create them for different purposes in Elixir.
In Elixir, the Enum
module is greedy. This means that when we pass it a collection, it potentially consumes all the contents of that collection. It also means the result will typically be another collection. Look at the following pipeline:
[ 1, 2, 3, 4, 5 ]
#=> [ 1, 2, 3, 4, 5 ]
|> Enum.map(&(&1*&1))
#=> [ 1, 4, 9, 16, 25 ]
|> Enum.with_index
#=> [ {1, 0}, {4, 1}, {9, 2}, {16, 3}, {25, 4} ]
|> Enum.map(fn {value, index} -> value - index end)
#=> [1, 3, 7, 13, 21]
|> IO.inspect
#=> [1, 3, 7, 13, 21]
The first map
function takes the original list and creates a new list of its squares. Using with_index
takes this list and returns a list of tuples. The next map
then subtracts the index from the value, generating a list that gets passed to IO.inspect
.
So, this pipeline generates four lists on its way to outputting the final result.
Let’s look at something different. Here’s some code that reads lines from a file and returns the longest line:
IO.puts File.read!("/usr/share/dict/words
...