Sha256: 5d9af217e20b4f9e3dc03bdf0d988c2eb3cb541afa31fdab7a8f38db54c4dafb

Contents?: true

Size: 958 Bytes

Versions: 6

Compression:

Stored size: 958 Bytes

Contents

# frozen_string_literal: true

module Pbt
  module Arbitrary
    # Generates values from another arbitrary, but only if they pass a predicate.
    class FilterArbitrary < Arbitrary
      # @param arb [Arbitrary] Arbitrary to generate values to be filtered.
      # @param refinement [Proc] Predicate proc to test each produced element. Return true to keep the element, false otherwise.
      def initialize(arb, &refinement)
        @arb = arb
        @refinement = refinement
      end

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

      # @see Arbitrary#shrink
      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
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
pbt-0.5.0 lib/pbt/arbitrary/filter_arbitrary.rb
pbt-0.4.0 lib/pbt/arbitrary/filter_arbitrary.rb
pbt-0.3.0 lib/pbt/arbitrary/filter_arbitrary.rb
pbt-0.2.0 lib/pbt/arbitrary/filter_arbitrary.rb
pbt-0.1.1 lib/pbt/arbitrary/filter_arbitrary.rb
pbt-0.1.0 lib/pbt/arbitrary/filter_arbitrary.rb