Method: Factbase::Query#each

Defined in:
lib/factbase/query.rb

#each(fb = @fb, params = {}) {|Fact| ... } ⇒ Integer

Iterate facts one by one.

Parameters:

  • fb (Factbase) (defaults to: @fb)

    The factbase

  • params (Hash) (defaults to: {})

    Optional params accessible in the query via the “$” symbol

Yields:

  • (Fact)

    Facts one-by-one

Returns:

  • (Integer)

    Total number of facts yielded (if block given), otherwise enumerator



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/factbase/query.rb', line 45

def each(fb = @fb, params = {})
  return to_enum(__method__, fb, params) unless block_given?
  yielded = 0
  params = params.transform_keys(&:to_s) if params.is_a?(Hash)
  maybe = @term.predict(@maps, fb, Factbase::Tee.new({}, params))
  maybe ||= @maps unless maybe.equal?(@maps)
  maybe.each do |m|
    extras = {}
    f = Factbase::Fact.new(m)
    f = Factbase::Tee.new(f, params)
    a = Factbase::Accum.new(f, extras, false)
    r = @term.evaluate(a, @maps, fb)
    unless r.is_a?(TrueClass) || r.is_a?(FalseClass)
      raise "Unexpected evaluation result of type #{r.class}, must be Boolean at #{@term.inspect}"
    end
    next unless r
    yield Factbase::Accum.new(f, extras, true)
    yielded += 1
  end
  yielded
end