Erlang stream a file line by line

Erlang
-module(read_lines).
-export([fold_lines/3]).

fold_lines(Path, Fun, Acc0) ->
    {ok, Io} = file:open(Path, [read, binary, {read_ahead, 65536}]),
    try
        loop(Io, Fun, Acc0)
    after
        file:close(Io)
    end.

loop(Io, Fun, Acc) ->
    case file:read_line(Io) of
        {ok, Bin} ->
            Line = string:trim(binary_to_list(Bin), trailing, "\r\n"),
            loop(Io, Fun, Fun(Line, Acc));
        eof -> Acc;
        {error, Reason} -> error({read_failed, Reason})
    end.