defmodule Manganese.EntityKit.Structs.EntitiesSearchResult do alias Manganese.EntityKit.Structs @typedoc """ """ @type t :: %Structs.EntitiesSearchResult{ entities: Structs.EntitiesCollection.t, entity_ids: [ integer ], parameters: term, count: non_neg_integer } defstruct [ entities: Structs.EntitiesCollection.new, entity_ids: [], parameters: nil, count: 0 ] # Utilities @doc """ """ @spec new :: t def new, do: %Structs.EntitiesSearchResult{} @doc """ """ @spec put_entity(t, atom, term) :: t def put_entity(search_result, entity_type, entity) do entity_ids = (search_result.entity_ids ++ [ entity.id ]) |> Enum.uniq %{ search_result | entities: search_result.entities |> Structs.EntitiesCollection.put_entity(entity_type, entity), entity_ids: entity_ids, count: max(search_result.count, length(entity_ids)) } end @doc """ """ @spec put_entities(t, atom, [ term ]) :: t def put_entities(search_result, entity_type, entities) do entity_ids = ( search_result.entity_ids ++ entities |> Enum.map(fn entity -> entity.id end) ) |> Enum.uniq %{ search_result | entities: search_result.entities |> Structs.EntitiesCollection.put_entities(entity_type, entities), entity_ids: entity_ids, count: max(search_result.count, length(entity_ids)) } end @doc """ """ def put_parameters(search_result, parameters) do %{ search_result | parameters: parameters } end @doc """ """ def put_count(search_result, count) do %{ search_result | count: count } end end