class Dry::Effects::Providers::Random

Constants

DEFAULT
DEFAULT_RANDOM
DEFAULT_RANGE

Public Instance Methods

build_generator(options) click to toggle source
# File lib/dry/effects/providers/random.rb, line 62
def build_generator(options)
  case options
  when Undefined
    DEFAULT
  when ::Hash
    if options.key?(:seed)
      random = ::Random.new(options[:seed])
    else
      random = DEFAULT_RANDOM
    end

    -> _ { random.rand }
  else
    generator = options

    lambda do |prev|
      prev.nil? ? generator.() : generator.(prev)
    end
  end
end
call(options = Undefined) { || ... } click to toggle source
# File lib/dry/effects/providers/random.rb, line 38
def call(options = Undefined)
  @prev = nil
  @generator = build_generator(options)
  yield
end
next_float(low, high) click to toggle source
# File lib/dry/effects/providers/random.rb, line 56
def next_float(low, high)
  @prev = @generator.(@prev) % 1

  low + (@prev * (high - low))
end
next_integer(low, high, exclude_end) click to toggle source
# File lib/dry/effects/providers/random.rb, line 44
def next_integer(low, high, exclude_end)
  @prev = @generator.(@prev) % 1

  value = low + (@prev * (high - low)).round

  if value.eql?(high) && exclude_end
    low
  else
    value
  end
end
rand(range_or_limit = nil) click to toggle source
# File lib/dry/effects/providers/random.rb, line 14
def rand(range_or_limit = nil)
  range_or_limit ||= DEFAULT_RANGE

  if range_or_limit.is_a?(::Range)
    low = range_or_limit.begin
    high = range_or_limit.end
    exclude_end = range_or_limit.exclude_end?
  elsif range_or_limit >= 1
    low = 0
    high = range_or_limit.floor
    exclude_end = true
  else
    low = 0.0
    high = range_or_limit.to_f
    exclude_end = true
  end

  if low.is_a?(::Integer)
    next_integer(low, high, exclude_end)
  else
    next_float(low, high)
  end
end