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

Link to this function

add_data(state, new_data)

Specs

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"]}

Specs

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"}
Link to this function

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"
Link to this function

new(splitter \\ "\n")

Specs

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"}

Specs

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"
Link to this function

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"]}