lib/membrane/payload/shm.ex

defmodule Membrane.Payload.Shm do
  @moduledoc """
  Wrapper over `Shmex` module, implementing `Membrane.Payload.Behaviour`
  """
  @behaviour Membrane.Payload.Behaviour

  @type t :: Shmex.t()

  @impl true
  defdelegate empty(), to: Shmex

  @impl true
  defdelegate new(data), to: Shmex
end

defimpl Membrane.Payload, for: Shmex do
  @impl true
  def size(%Shmex{size: size}) do
    size
  end

  @impl true
  def split_at(%Shmex{size: size} = shm, at_pos) when 0 < at_pos and at_pos < size do
    {:ok, payloads} = Shmex.Native.split_at(shm, at_pos)
    payloads
  end

  @impl true
  def concat(left, right) do
    {:ok, res} = Shmex.Native.append(left, right)
    res
  end

  @impl true
  def drop(payload, n) do
    {:ok, new_payload} = Shmex.Native.trim(payload, n)
    new_payload
  end

  @impl true
  defdelegate to_binary(payload), to: Shmex

  @impl true
  def module(_), do: Membrane.Payload.Shm
end