Sha256: 02982b9c9937d3e729e477e9141fc0a9433a68760645885a0326f4ef7955e670
Contents?: true
Size: 1.91 KB
Versions: 3
Compression:
Stored size: 1.91 KB
Contents
# frozen_string_literal: true require 'dry/effects/provider' module Dry module Effects module Providers class Random < Provider[:random] DEFAULT = -> _ { ::Random::DEFAULT.rand } DEFAULT_RANGE = 0.0...1.0 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 def call(options = Undefined) @prev = nil @generator = build_generator(options) yield end 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 def next_float(low, high) @prev = @generator.(@prev) % 1 low + (@prev * (high - low)) end def build_generator(options) case options when Undefined DEFAULT when ::Hash if options.key?(:seed) random = ::Random.new(options[:seed]) else random = ::Random::DEFAULT end -> _ { random.rand } else generator = options lambda do |prev| prev.nil? ? generator.() : generator.(prev) end end end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
dry-effects-0.1.5 | lib/dry/effects/providers/random.rb |
dry-effects-0.1.4 | lib/dry/effects/providers/random.rb |
dry-effects-0.1.3 | lib/dry/effects/providers/random.rb |