Current section

Files

Jump to
exiffer lib exiffer offset_buffer.ex
Raw

lib/exiffer/offset_buffer.ex

defmodule Exiffer.OffsetBuffer do
@moduledoc """
Documentation for `Exiffer.OffsetBuffer`.
Wraps Exiffer.Buffer while appending an offset amount to positions
"""
alias Exiffer.Buffer
require Logger
@enforce_keys ~w(buffer offset)a
defstruct ~w(buffer offset)a
def new(%{} = buffer, offset \\ 0) do
%__MODULE__{buffer: buffer, offset: offset}
end
def seek(%__MODULE__{buffer: buffer, offset: offset} = offset_buffer, position) do
new_position = offset + position
buffer = Buffer.seek(buffer, new_position)
struct!(offset_buffer, buffer: buffer)
end
def consume(%__MODULE__{buffer: buffer} = offset_buffer, amount) do
{result, buffer} = Buffer.consume(buffer, amount)
{result, struct!(offset_buffer, buffer: buffer)}
end
def push(%__MODULE__{buffer: buffer} = offset_buffer, chunk) do
buffer = Buffer.push(buffer, chunk)
%{offset_buffer | buffer: buffer}
end
def skip(%__MODULE__{buffer: buffer} = offset_buffer, amount) do
buffer = Buffer.skip(buffer, amount)
struct!(offset_buffer, buffer: buffer)
end
def random(%__MODULE__{buffer: buffer, offset: offset}, position, count) do
Buffer.random(buffer, offset + position, count)
end
def tell(%__MODULE__{buffer: buffer, offset: offset}) do
buffer.position - offset
end
def read_eof(%__MODULE__{buffer: buffer} = offset_buffer) do
{chunk, buffer} = Buffer.read_eof(buffer)
{chunk, %{offset_buffer | buffer: buffer}}
end
defimpl Exiffer.Buffer do
alias Exiffer.OffsetBuffer
def offset_buffer(buffer, offset) do
OffsetBuffer.new(buffer.buffer, offset)
end
def consume(buffer, count) do
OffsetBuffer.consume(buffer, count)
end
def push(buffer, chunk) do
OffsetBuffer.push(buffer, chunk)
end
def seek(buffer, position) do
OffsetBuffer.seek(buffer, position)
end
def skip(buffer, count) do
OffsetBuffer.skip(buffer, count)
end
def random(buffer, read_position, count) do
OffsetBuffer.random(buffer, read_position, count)
end
def tell(buffer) do
OffsetBuffer.tell(buffer)
end
def read_eof(buffer) do
OffsetBuffer.read_eof(buffer)
end
end
end