Class: Integer

Inherits:
Object show all
Defined in:
lib/propr/random/integer.rb,
lib/propr/shrink/integer.rb

Constant Summary collapse

MAX =
2 ** (0.size * 8 - 2) - 1
MIN =
-MAX + 1

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.random(options = {}, m = Propr::Random) ⇒ Object

Raises:

  • (ArgumentError)


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/propr/random/integer.rb', line 7

def random(options = {}, m = Propr::Random)
  min = (options[:min] || Integer::MIN).to_i
  max = (options[:max] || Integer::MAX).to_i

  raise ArgumentError,
    "min > max" if min > max

  range  = max - min
  center = options.fetch(:center, :mid)
  center =
    case center
    when :mid then min + (max - min).div(2)
    when :min then min
    when :max then max
    when Numeric
      raise ArgumentError,
        "center < min" if center < min
      raise ArgumentError,
        "center > max" if center > max
      center
    else raise ArgumentError,
      "center must be :min, :mid, :max, or min <= Integer <= max"
    end

  m.bind(m.rand(range + 1)) do |rnd|
    m.bind(m.scale(rnd + min, range, BigDecimal(center))) do |n|
      # Round up or down to integer nearest center
      m.unit(n > center ? n.floor : n.ceil)
    end
  end
end

Instance Method Details

#shrinkEnumerator<Integer>

Returns:



3
4
5
6
7
8
9
# File 'lib/propr/shrink/integer.rb', line 3

def shrink
  Array.unfold(self) do |seed|
    zero  = 0
    seed_ = zero + (seed - zero) / 2
    (seed != seed_).maybe([zero + self - seed, seed_])
  end
end