Skip to content

Commit b597ed8

Browse files
doriantaylorgkellogg
authored andcommitted
popping out statement coercion in RDF::Writable
1 parent b107ebf commit b597ed8

2 files changed

Lines changed: 42 additions & 26 deletions

File tree

lib/rdf/mixin/mutable.rb

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -154,20 +154,9 @@ def update(*statements)
154154
def delete(*statements)
155155
raise TypeError.new("#{self} is immutable") if immutable?
156156

157-
statements.map! do |value|
158-
case
159-
when value.respond_to?(:each_statement)
160-
delete_statements(value)
161-
nil
162-
when (statement = Statement.from(value)).constant?
163-
statement
164-
else
165-
delete_statements(query(value))
166-
nil
167-
end
157+
process_statements(statements, query: true, constant: true) do |value|
158+
delete_statements(value)
168159
end
169-
statements.compact!
170-
delete_statements(statements) unless statements.empty?
171160

172161
return self
173162
end

lib/rdf/mixin/writable.rb

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,26 +58,53 @@ def <<(data)
5858
# @param [Enumerable<RDF::Statement>] statements
5959
# @return [self]
6060
def insert(*statements)
61-
statements.map! do |value|
62-
case
63-
when value.respond_to?(:each_statement)
64-
insert_statements(value)
65-
nil
66-
when (statement = Statement.from(value))
67-
statement
68-
else
69-
raise ArgumentError.new("not a valid statement: #{value.inspect}")
70-
end
71-
end
72-
statements.compact!
73-
insert_statements(statements) unless statements.empty?
61+
process_statements(statements) { |value| insert_statements(value) }
7462

7563
return self
7664
end
7765
alias_method :insert!, :insert
7866

7967
protected
8068

69+
##
70+
# Coerce a set of arguments into {RDF::Statement} objects and then
71+
# operate over them with a block.
72+
#
73+
# @example
74+
# process_statements(statements) { |value| do_something(value) }
75+
#
76+
# @param statements [#map] The arbitrary-ish input to be manipulated
77+
# @param query [false, true] Whether to call +query+ before the block
78+
# @param constant [false, true] Whether to test if the statements
79+
# are constant
80+
# @yield [RDF::Statement, RDF::Enumerable]
81+
# @return statements
82+
def process_statements(statements, query: false, constant: false, &block)
83+
raise ArgumentError, 'expecting a block' unless block_given?
84+
85+
statements = statements.map do |value|
86+
case
87+
when value.respond_to?(:each_statement)
88+
block.call(value)
89+
nil
90+
when (statement = Statement.from(value)) &&
91+
(!constant || statement.constant?)
92+
statement
93+
when query
94+
block.call(query(value))
95+
nil
96+
else
97+
raise ArgumentError, "Not a valid statement: #{value.inspect}"
98+
end
99+
end.compact
100+
101+
block.call(statements) unless statements.empty?
102+
103+
# eh might as well return these
104+
statements
105+
end
106+
107+
81108
##
82109
# Inserts statements from the given RDF reader into the underlying
83110
# storage or output stream.

0 commit comments

Comments
 (0)