Class: Fbe::Conclude

Inherits:
Object
  • Object
show all
Defined in:
lib/fbe/conclude.rb

Overview

A concluding block.

You may want to use this class when you want to go through a number of facts in the factbase, applying a certain algorithm to each of them and possibly creating new facts from them.

For example, you want to make a new good fact for every bad fact found:

require 'fbe/conclude' conclude do on '(exists bad)' follow 'when' draw do |n, b| n.good = 'yes!' end end

This snippet will find all facts that have bad property and then create new facts, letting the block in the #draw deal with them.

Author

Yegor Bugayenko (yegor256@gmail.com)

Copyright

Copyright (c) 2024-2026 Zerocracy

License

MIT

Instance Method Summary collapse

Constructor Details

#initialize(fb:, judge:, global:, options:, loog:, epoch:, kickoff:, slot: 1) ⇒ Conclude

Ctor.

Parameters:

  • fb (Factbase)

    The factbase

  • judge (String)

    The name of the judge, from the judges tool

  • global (Hash)

    The hash for global caching

  • options (Judges::Options)

    The options coming from the judges tool

  • loog (Loog)

    The logging facility

  • epoch (Time)

    When the entire update started

  • kickoff (Time)

    When the particular judge started

  • slot (Integer) (defaults to: 1)

    Seconds a single iteration may need



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/fbe/conclude.rb', line 73

def initialize(fb:, judge:, global:, options:, loog:, epoch:, kickoff:, slot: 1)
  @fb = fb
  @judge = judge
  @loog = loog
  @options = options
  @global = global
  @epoch = epoch
  @kickoff = kickoff
  @slot = slot
  @query = nil
  @follows = []
  @lifetime = true
  @timeout = true
  @quota = true
end

Instance Method Details

#consider {|Factbase::Fact| ... } ⇒ Integer

Take every fact, allowing the given block to process it.

For example, you want to add when property to every fact:

require 'fbe/conclude' conclude do on '(always)' consider do |f| f.when = Time.new end end

Yields:

  • (Factbase::Fact)

    The next fact found by the query

Returns:

  • (Integer)

    The count of the facts processed



177
178
179
180
181
182
# File 'lib/fbe/conclude.rb', line 177

def consider(&)
  roll do |_fbt, a|
    yield(a)
    nil
  end
end

#draw {|Array<Factbase::Fact,Factbase::Fact>| ... } ⇒ Integer

Create new fact from every fact found by the query.

For example, you want to conclude a reward from every win fact:

require 'fbe/conclude' conclude do on '(exists win)' follow 'win when' draw do |n, w| n.reward = 10 end end

This snippet will find all facts that have win property and will create new facts for all of them, passing them one by one in to the block of the draw, where n would be the new created fact and the w would be the fact found.

Yields:

  • (Array<Factbase::Fact,Factbase::Fact>)

    New fact and seen fact

Returns:

  • (Integer)

    The count of the facts processed



155
156
157
158
159
160
161
# File 'lib/fbe/conclude.rb', line 155

def draw(&)
  roll do |fbt, a|
    n = fbt.insert
    fill(n, a, &)
    n
  end
end

#follow(props) ⇒ nil

Set the list of properties to copy from the facts found to new facts.

Parameters:

  • props (Array<String>)

    List of property names

Returns:

  • (nil)

    Nothing

Raises:



130
131
132
133
# File 'lib/fbe/conclude.rb', line 130

def follow(props)
  raise(Fbe::Error, 'Follow is already set') unless @follows.empty?
  @follows = props.strip.split.compact
end

#lifetime_unawarenil

Make this block NOT aware of lifetime limitations.

When the lifetime is over, the loop will NOT gracefully stop.

Returns:

  • (nil)

    Nothing is returned



104
105
106
# File 'lib/fbe/conclude.rb', line 104

def lifetime_unaware
  @lifetime = false
end

#on(query) ⇒ nil

Set the query that should find the facts in the factbase.

Parameters:

  • query (String)

    The query to execute

Returns:

  • (nil)

    Nothing is returned

Raises:



121
122
123
124
# File 'lib/fbe/conclude.rb', line 121

def on(query)
  raise(Fbe::Error, 'Query is already set') unless @query.nil?
  @query = query
end

#quota_unawarenil

Make this block not aware of GitHub API quota.

When the quota is reached, the loop will NOT gracefully stop to avoid hitting GitHub API rate limits.

Returns:

  • (nil)

    Nothing is returned



95
96
97
# File 'lib/fbe/conclude.rb', line 95

def quota_unaware
  @quota = false
end

#timeout_unawarenil

Make this block NOT aware of timeout limitations.

When the timeout is over, the loop will NOT gracefully stop.

Returns:

  • (nil)

    Nothing is returned



113
114
115
# File 'lib/fbe/conclude.rb', line 113

def timeout_unaware
  @timeout = false
end