lib/rdf/util/coercions.rb
# -*- coding: utf-8 -*-
module RDF
module Util
module Coercions
# This is a provisional module intended to house input
# coercions. Currently the only coercion is a statement
# preprocessor that is used in e.g. {RDF::Writable#insert} and
# {RDF::Mutable#delete}.
protected
##
# Coerce an array of arguments into {RDF::Statement}, or
# {RDF::Enumerable} and then yield to a block. Note that this
# code was amalgamated from that which was sandwiched around
# both {RDF::Writable#insert_statements} and
# {RDF::Mutable#delete_statements}. The parameters `query` and
# `constant` are therefore present to handle the conditions
# where the statements contain wildcards and what to do about
# them.
#
# @example
# coerce_statements(statements) { |value| do_something(value) }
#
# @param statements [#map] The arbitrary-ish input to be manipulated
# @param query [false, true] Whether to call `query` before the block
# (as expected by {Mutable#delete_statements})
# @param constant [false, true] Whether to test if the statements
# are constant (as expected by {Mutable#delete_statements})
# @yield [RDF::Statement, RDF::Enumerable]
# @return statements
def coerce_statements(statements, query: false, constant: false, &block)
raise ArgumentError, 'expecting a block' unless block_given?
statements = statements.map do |value|
case
when value.respond_to?(:each_statement)
block.call(value)
nil
when (statement = Statement.from(value)) &&
(!constant || statement.constant?)
statement
when query
# XXX note that this only makes sense when the module is include()d
block.call(self.query(value))
nil
else
raise ArgumentError, "Not a valid statement: #{value.inspect}"
end
end.compact
block.call(statements) unless statements.empty?
# eh might as well return these
statements
end
end
end
end