Store datatype in a RDF.Literal.Generic internally as string

Besides being a bit more memory efficient this allows for
pattern matching on the datatype of generic literals.
This commit is contained in:
Marcel Otto 2020-05-16 00:06:45 +02:00
parent 25a0f7443c
commit 0509e4cb2f
2 changed files with 8 additions and 9 deletions

View file

@ -33,7 +33,8 @@ defmodule RDF.Literal.Generic do
defp normalize_datatype(nil), do: nil
defp normalize_datatype(""), do: nil
defp normalize_datatype(datatype), do: IRI.new(datatype)
defp normalize_datatype(%IRI{} = datatype), do: to_string(datatype)
defp normalize_datatype(datatype), do: datatype
@impl Datatype
@spec new!(any, String.t | IRI.t | keyword) :: Literal.t
@ -49,7 +50,7 @@ defmodule RDF.Literal.Generic do
@impl Datatype
def datatype_id(%Literal{literal: literal}), do: datatype_id(literal)
def datatype_id(%__MODULE__{} = literal), do: literal.datatype
def datatype_id(%__MODULE__{} = literal), do: RDF.iri(literal.datatype)
@impl Datatype
def value(%Literal{literal: literal}), do: value(literal)
@ -69,7 +70,7 @@ defmodule RDF.Literal.Generic do
@impl Datatype
def valid?(%Literal{literal: %__MODULE__{} = literal}), do: valid?(literal)
def valid?(%__MODULE__{datatype: %IRI{}}), do: true
def valid?(%__MODULE__{datatype: datatype}) when is_binary(datatype), do: true
def valid?(_), do: false
@doc """

View file

@ -12,11 +12,10 @@ defmodule RDF.Literal.GenericTest do
describe "new" do
test "with value and datatype" do
Enum.each @valid, fn {input, {value, datatype}} ->
datatype_iri = RDF.iri(datatype)
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype_iri}} =
Generic.new(input, datatype: datatype_iri)
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype_iri}} =
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype}} =
Generic.new(input, datatype: datatype)
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype}} =
Generic.new(input, datatype: RDF.iri(datatype))
end
end
@ -30,8 +29,7 @@ defmodule RDF.Literal.GenericTest do
test "with canonicalize opts" do
Enum.each @valid, fn {input, {value, datatype}} ->
datatype_iri = RDF.iri(datatype)
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype_iri}} =
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype}} =
Generic.new(input, datatype: datatype, canonicalize: true)
end
end