Packages
xandra
0.19.3
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc.9
0.18.0-rc.8
0.18.0-rc.7
0.18.0-rc.6
0.18.0-rc.5
0.18.0-rc.4
0.18.0-rc.3
0.18.0-rc.2
0.18.0-rc.1
0.17.0
0.16.0
0.15.0
0.15.0-rc.1
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.0
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
Fast, simple, and robust Cassandra driver for Elixir.
Current section
Files
Jump to
Current section
Files
lib/xandra/page_stream.ex
defmodule Xandra.PageStream do
@moduledoc false
@type t() :: %__MODULE__{
state: :new | :done | :run,
conn: Xandra.conn(),
params: Xandra.values(),
options: keyword(),
query: Xandra.statement() | Xandra.Prepared.t() | Xandra.Batch.t() | Xandra.Simple.t()
}
defstruct [:conn, :query, :params, :options, state: :new]
defimpl Enumerable do
alias Xandra.Page
def reduce(page_stream, acc, fun) do
Stream.resource(fn -> start(page_stream) end, &next/1, &close/1).(acc, fun)
end
def member?(_page_stream, _value), do: {:error, __MODULE__}
def count(_page_stream), do: {:error, __MODULE__}
def slice(_page_stream), do: {:error, __MODULE__}
defp start(%{state: :new} = page_stream) do
%{page_stream | state: :run}
end
defp next(%{state: :done} = page_stream) do
{:halt, page_stream}
end
defp next(page_stream) do
%@for{conn: conn, query: query, params: params, options: options} = page_stream
case Xandra.execute!(conn, query, params, options) do
%Page{paging_state: nil} = page ->
{[page], %@for{page_stream | state: :done}}
%Page{paging_state: paging_state} = page ->
options = Keyword.put(options, :paging_state, paging_state)
{[page], %@for{page_stream | options: options}}
end
end
defp close(page_stream) do
page_stream
end
end
defimpl Inspect do
import Inspect.Algebra
def inspect(page_stream, options) do
properties = [
query: page_stream.query,
params: page_stream.params,
options: page_stream.options
]
concat(["#Xandra.PageStream<", to_doc(properties, options), ">"])
end
end
end