Class: Pbt::Arbitrary::FilterArbitrary

Inherits:
Arbitrary
  • Object
show all
Defined in:
lib/pbt/arbitrary/filter_arbitrary.rb

Overview

Generates values from another arbitrary, but only if they pass a predicate.

Instance Method Summary collapse

Methods inherited from Arbitrary

#filter, #map

Constructor Details

#initialize(arb, &refinement) ⇒ FilterArbitrary

Returns a new instance of FilterArbitrary.

Parameters:

  • arb (Arbitrary)

    Arbitrary to generate values to be filtered.

  • refinement (Proc)

    Predicate proc to test each produced element. Return true to keep the element, false otherwise.



9
10
11
12
# File 'lib/pbt/arbitrary/filter_arbitrary.rb', line 9

def initialize(arb, &refinement)
  @arb = arb
  @refinement = refinement
end

Instance Method Details

#generate(rng) ⇒ Object

See Also:



15
16
17
18
19
20
# File 'lib/pbt/arbitrary/filter_arbitrary.rb', line 15

def generate(rng)
  loop do
    val = @arb.generate(rng)
    return val if @refinement.call(val)
  end
end

#shrink(current) ⇒ Object

See Also:



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/pbt/arbitrary/filter_arbitrary.rb', line 23

def shrink(current)
  Enumerator.new do |y|
    @arb.shrink(current).each do |v|
      if @refinement.call(v)
        y.yield v
      else
        next
      end
    end
  end
end