rdf-ex/lib/rdf/blank_node.ex

59 lines
1.2 KiB
Elixir
Raw Normal View History

2016-10-15 16:26:56 +00:00
defmodule RDF.BlankNode do
@moduledoc """
A RDF blank node (aka bnode) is a local node of a graph without an IRI.
see <https://www.w3.org/TR/rdf11-primer/#section-blank-node>
and <https://www.w3.org/TR/rdf11-concepts/#section-blank-nodes>
2016-10-15 16:26:56 +00:00
"""
2018-09-09 22:27:40 +00:00
@enforce_keys [:id]
2016-10-15 16:26:56 +00:00
defstruct [:id]
@type t :: module
2017-06-16 11:13:56 +00:00
@doc """
Creates a `RDF.BlankNode` with an arbitrary internal id.
2017-06-16 11:13:56 +00:00
"""
def new,
do: new(make_ref())
2017-06-16 11:13:56 +00:00
@doc """
Creates a `RDF.BlankNode` with a user-defined identity.
2017-06-16 11:13:56 +00:00
## Examples
iex> RDF.bnode(:foo)
%RDF.BlankNode{id: "foo"}
"""
def new(id)
def new(id) when is_binary(id),
do: %RDF.BlankNode{id: id}
2017-06-16 11:13:56 +00:00
def new(id) when is_reference(id),
do: id |> :erlang.ref_to_list |> to_string |> String.replace(~r/\<|\>/, "") |> new
2017-06-16 11:13:56 +00:00
def new(id) when is_atom(id) or is_integer(id),
do: id |> to_string |> new
2016-10-15 16:26:56 +00:00
@doc """
Tests for value equality of blank nodes.
Returns `nil` when the given arguments are not comparable as blank nodes.
"""
def equal_value?(left, right)
def equal_value?(%RDF.BlankNode{id: left}, %RDF.BlankNode{id: right}),
do: left == right
def equal_value?(_, _),
do: nil
defimpl String.Chars do
def to_string(%RDF.BlankNode{id: id}), do: "_:#{id}"
end
2016-10-15 16:26:56 +00:00
end