defmodule Meeseeks.Result do @moduledoc """ Results are the product of running selections on a document, and package together a node id and the `Meeseeks.Document` for which that id is valid. Results are generally used in one of two ways: either data, such as an element's tag, is extracted from a result, or further selections are ran using the result as a source. When a result is used as a source for further selection, the original document the result came from is used for context, meaning that questions about the results ancestors may be asked, but also that queries involving ancestors need to account for the whole document, not just the contents of the result. ## Examples iex> import Meeseeks.CSS iex> document = Meeseeks.parse("
") #Meeseeks.Document<{...}> iex> ul = Meeseeks.one(document, css("ul")) #Meeseeks.Result<{ }> iex> Meeseeks.tag(ul) "ul" iex> Meeseeks.all(ul, css("li")) |> List.last() #Meeseeks.Result<{
  • 2
  • }> """ alias Meeseeks.Document alias Meeseeks.Result alias Meeseeks.TupleTree @enforce_keys [:document, :id] defstruct document: nil, id: nil @type t :: %Result{document: Document.t(), id: Document.node_id()} @doc """ Returns the value for attribute in result, or nil if there isn't one. """ @spec attr(Result.t(), String.t()) :: String.t() | nil def attr(result, attribute) def attr(%Result{id: id, document: document}, attribute) do node = Document.get_node(document, id) Document.Node.attr(node, attribute) end @doc """ Returns the result's attributes list, which may be empty, or nil if result represents a node without attributes. """ @spec attrs(Result.t()) :: [{String.t(), String.t()}] | nil def attrs(result) def attrs(%Result{id: id, document: document}) do node = Document.get_node(document, id) Document.Node.attrs(node) end @doc """ Returns the combined data of result or result's children, which may be an empty string. Data is the content of `