When people say Elixir is just syntactic sugar on top of erlang I point them to Stream and Enum. It's a great example of how polymorphism via protocols is an enabler for powerful designs.
Interesting to see this as a novel thing in another ecosystem. Rust actually uses "stream" manipulation as a default way of dealing with things that might otherwise be expressed as full data structures. For example, the equivalent to one of the code snippets in the article would be:<p>BufReader::new(File::open("myfile.txt").unwrap())<p>.lines()<p>.enumerate()<p>.map(|(i, line)| format!("{}: {}", i, line.unwrap()))<p>.take(1)<p>.next().unwrap()<p>(formatted for non-monospace font readability). Note the .unwrap() is where error handling should normally happen.