Packages
mob_dev
0.6.12
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.37
0.3.35
0.3.34
0.3.33
0.3.28
0.3.26
0.3.23
0.3.21
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.18
0.2.17
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Development tooling for the Mob mobile framework
Current section
Files
Jump to
Current section
Files
lib/mob_dev/server/ring_log.ex
defmodule MobDev.Server.RingLog do
@moduledoc false
# Shared GenServer behaviour for in-memory ring-buffer log holders.
# `LogBuffer` and `ElixirLogBuffer` differ only in their limit; both
# `use MobDev.Server.RingLog, limit: N` to get the standard
# `get/0`, `push/1`, `clear/0` API plus the GenServer callbacks.
defmacro __using__(opts) do
limit = Keyword.fetch!(opts, :limit)
quote bind_quoted: [limit: limit] do
use GenServer
@limit limit
@spec start_link(keyword()) :: GenServer.on_start()
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
end
@spec get() :: [map()]
def get, do: GenServer.call(__MODULE__, :get)
@spec push(map()) :: :ok
def push(line), do: GenServer.cast(__MODULE__, {:push, line})
@spec clear() :: :ok
def clear, do: GenServer.cast(__MODULE__, :clear)
@impl GenServer
def init(_), do: {:ok, []}
@impl GenServer
def handle_call(:get, _from, lines), do: {:reply, lines, lines}
@impl GenServer
def handle_cast({:push, line}, lines), do: {:noreply, Enum.take([line | lines], @limit)}
def handle_cast(:clear, _lines), do: {:noreply, []}
end
end
end