Skip to main content

examples/interpreter_adapter.exs

defmodule CounterInterpreter do
  @behaviour BeamWeaver.Sandbox.Interpreter

  @impl true
  def open(_opts), do: {:ok, %{counter: 0}}

  @impl true
  def eval(state, "inc", _opts) do
    state = update_in(state.counter, &(&1 + 1))
    {:ok, state.counter, state}
  end

  def eval(state, "get", _opts), do: {:ok, state.counter, state}

  @impl true
  def snapshot(state, _opts), do: {:ok, state, %{runtime: "counter"}}

  @impl true
  def restore(snapshot, _opts), do: {:ok, snapshot}

  @impl true
  def close(_state, _opts), do: :ok
end

alias BeamWeaver.Sandbox.Interpreter.Session

{:ok, session} =
  Session.start(
    adapter: CounterInterpreter,
    timeout: 1_000,
    max_snapshot_bytes: 10_000
  )

{:ok, 1} = Session.eval(session, "inc")
{:ok, snapshot} = Session.snapshot(session)
{:ok, 2} = Session.eval(session, "inc")

{:ok, restored} = Session.start(adapter: CounterInterpreter)
:ok = Session.restore(restored, snapshot)

{:ok, 1} = Session.eval(restored, "get")

Session.close(session)
Session.close(restored)

IO.inspect(snapshot, label: "checkpoint-safe snapshot")