LineBuffer (LineBuffer v1.0.0)
Buffer lines like a boss.
Link to this section Summary
Functions
Add data to a line buffer
Flush (empty) the buffer.
Get the splitter from state
Create a new line buffer
Get the current string being buffered.
Set the splitter.
Link to this section Functions
add_data(state, new_data)
Specs
add_data(LineBuffer.State.t(), String.t()) :: {LineBuffer.State.t(), [String.t()]}
Add data to a line buffer
Parameters
- state: An initialized
%State{}
- new_data: A
String.t()
to use to split input into lines, defaults to"\n"
Returns
{updated_state, [line_without_delimiter]}
Examples
iex> lb = LineBuffer.new()
%LineBuffer.State{buf: "", splitter: "\n"}
iex> LineBuffer.add_data(lb, "foo\n")
{%LineBuffer.State{buf: "", splitter: "\n"}, ["foo"]}
iex> lb = LineBuffer.new()
%LineBuffer.State{buf: "", splitter: "\n"}
iex> LineBuffer.add_data(lb, "foo\nbar")
{%LineBuffer.State{buf: "bar", splitter: "\n"}, ["foo"]}
iex> lb = LineBuffer.new()
%LineBuffer.State{buf: "", splitter: "\n"}
iex> LineBuffer.add_data(lb, "foo\nbar\n")
{%LineBuffer.State{buf: "", splitter: "\n"}, ["foo", "bar"]}
flush(state)
Specs
flush(LineBuffer.State.t()) :: {LineBuffer.State.t(), String.t()}
Flush (empty) the buffer.
Parameters
- state: An initialized
%State{}
Returns
New and emptied state and the old buffered data: {%State{}, String.t}
Examples
iex> lb = LineBuffer.new()
%LineBuffer.State{buf: "", splitter: "\n"}
iex> {updated_lb, _} = LineBuffer.add_data(lb, "foo\nbar")
{%LineBuffer.State{buf: "bar", splitter: "\n"}, ["foo"]}
iex> LineBuffer.flush(updated_lb)
{%LineBuffer.State{buf: "", splitter: "\n"}, "bar"}
get_splitter(state)
Specs
get_splitter(LineBuffer.State.t()) :: String.t()
Get the splitter from state
Parameters
- state: An initialized
%State{}
Returns
The splitter from state (a String.t()
)
Examples
iex> lb = LineBuffer.new()
%LineBuffer.State{buf: "", splitter: "\n"}
iex> LineBuffer.get_splitter(lb)
"\n"
new(splitter \\ "\n")
Specs
new(String.t()) :: LineBuffer.State.t()
Create a new line buffer
Parameters
- splitter: A string to use to split input into lines. Pass nil to use the default "\n"
Returns
%State{}
that is the first parameter to all other module functions.
Examples
# Default construction
iex> LineBuffer.new()
%LineBuffer.State{buf: "", splitter: "\n"}
# Specific splitter
iex> LineBuffer.new("\r\n")
%LineBuffer.State{buf: "", splitter: "\r\n"}
peek(state)
Specs
peek(LineBuffer.State.t()) :: String.t()
Get the current string being buffered.
Parameters
- state: An initialized
%State{}
Returns
String.t()
Examples
iex> lb = LineBuffer.new()
%LineBuffer.State{buf: "", splitter: "\n"}
iex> {updated_lb, _} = LineBuffer.add_data(lb, "foo\nbar")
{%LineBuffer.State{buf: "bar", splitter: "\n"}, ["foo"]}
iex> LineBuffer.peek(updated_lb)
"bar"
set_splitter(state, splitter)
Specs
set_splitter(LineBuffer.State.t(), String.t()) :: {LineBuffer.State.t(), [String.t()]}
Set the splitter.
Changing the splitter may cause new lines to be returned that were not considered lines before. Therefore this function is roughly equivalent to creating a new LineBuffer and adding the old line buffer's data to it.
Parameters
- state: An initialized
%State{}
- splitter: A string to use as the new splitter/delimiter
Returns
{state, [line_without_delimiter]}
Examples
iex> lb = LineBuffer.new("\r\n")
%LineBuffer.State{buf: "", splitter: "\r\n"}
iex> {updated_lb, _} = LineBuffer.add_data(lb, "foo\nbar\n")
{%LineBuffer.State{buf: "foo\nbar\n", splitter: "\r\n"}, []}
iex> LineBuffer.set_splitter(updated_lb, "\n")
{%LineBuffer.State{buf: "", splitter: "\n"}, ["foo", "bar"]}