@@ -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