defmodule Pdf.Array do
@moduledoc false
defstruct values: []
import Pdf.Size
@array_start "[ "
@array_start_length byte_size(@array_start)
@array_end "]"
@array_end_length byte_size(@array_end)
@initial_length @array_start_length + @array_end_length
def new(list), do: %__MODULE__{values: list}
def size(array), do: calculate_size(array.values)
def to_iolist(%Pdf.Array{values: values}) do
Pdf.Export.to_iolist([
@array_start,
Enum.map(values, fn value -> [value, " "] end),
@array_end
])
end
defp calculate_size([]), do: 0
defp calculate_size([_ | _] = list) do
@initial_length + Enum.reduce(list, length(list), fn value, acc -> acc + size_of(value) end)
end
defimpl Pdf.Size do
def size_of(%Pdf.Array{} = array), do: Pdf.Array.size(array)
end
defimpl Pdf.Export do
def to_iolist(array), do: Pdf.Array.to_iolist(array)
end
end