lib/sparql/algebra/expression.ex

defprotocol SPARQL.Algebra.Expression do

  def variables(expr)

  def evaluate(expr, data, execution_context)

end

defimpl SPARQL.Algebra.Expression, for: RDF.IRI do
  def variables(_), do: []
  def evaluate(iri, _, _), do: iri
end

defimpl SPARQL.Algebra.Expression, for: RDF.BlankNode do
  def variables(_), do: []
  def evaluate(bnode, _, _), do: bnode
end

defimpl SPARQL.Algebra.Expression, for: RDF.Literal do
  def variables(_), do: []
  def evaluate(literal, _, _), do: literal
end

defimpl SPARQL.Algebra.Expression, for: BitString do
  def variables(_), do: []
  def evaluate(variable, %{solution: solution}, _), do: Map.get(solution, variable)
end