Вот как я получил эффект, который хотел. Надеюсь, это поможет другим, кто в этом разбирается.
Еще раз большое спасибо Алексею за то, что он сэкономил мне столько времени.
defmodule StrangeStream do
do_stuff = fn(something) ->
# We'd do something useful here
something
end
{:ok, file} = File.open("file.txt", [:read, :line])
# Read the first line
first_line = IO.read(file, :line)
|> String.trim()
|> do_stuff.()
|> IO.inspect([label: "first_line"])
# Create side-effect streams
print_stream = IO.binstream(:stdio, :line)
file_stream = File.stream!("output.txt", [:write, :append])
# Convert IO to Stream and process
IO.stream(file, :line)
|> Stream.map(&String.trim(&1))
|> do_stuff.()
|> Stream.into(print_stream, fn(s)-> s <>"\n" end)
|> do_stuff.()
|> Stream.into(file_stream)
|> do_stuff.()
|> Enum.to_list()
|> IO.inspect([label: "rest of file"])
end
Вывод
first_line: "First line."
Second line.
Third line.
rest of file: ["Second line.", "Third line."]