class RegexpExamples::OrGroup

A boolean “or” group. The implementation is to pass in 2 set of (repeaters of) groups. The simplest example is: /a|b/ If you have more than one boolean “or” operator, then this is initially parsed as an OrGroup containing another OrGroup. However, in order to avoid probability distribution issues in Regexp#random_example, this then gets simplified down to one OrGroup containing 3+ repeaters.

Attributes

repeaters_list[R]

Public Class Methods

new(left_repeaters, right_repeaters) click to toggle source
# File lib/regexp-examples/groups.rb, line 147
def initialize(left_repeaters, right_repeaters)
  @repeaters_list = [left_repeaters, *merge_if_orgroup(right_repeaters)]
end

Public Instance Methods

random_result() click to toggle source
# File lib/regexp-examples/groups.rb, line 155
def random_result
  result_by_method(:random_result).sample(1)
end
result() click to toggle source
# File lib/regexp-examples/groups.rb, line 151
def result
  result_by_method(:result)
end

Private Instance Methods

merge_if_orgroup(repeaters) click to toggle source
# File lib/regexp-examples/groups.rb, line 171
def merge_if_orgroup(repeaters)
  if repeaters.size == 1 && repeaters.first.is_a?(OrGroup)
    repeaters.first.repeaters_list
  else
    [repeaters]
  end
end
result_by_method(method) click to toggle source
# File lib/regexp-examples/groups.rb, line 161
def result_by_method(method)
  max_results_limiter = MaxResultsLimiterBySum.new
  repeaters_list
    .map { |repeaters| RegexpExamples.generic_map_result(repeaters, method) }
    .map { |result| max_results_limiter.limit_results(result) }
    .inject(:concat)
    .map { |result| GroupResult.new(result) }
    .uniq
end