module Speculation::Gen
Constants
- GEN_BUILTINS
@private
Public Class Methods
@private
# File lib/speculation/gen.rb, line 64 def self.delay(&block) delayed = Concurrent::Delay.new(&block) ->(rantly) do delayed.value!.call(rantly) end end
@private
# File lib/speculation/gen.rb, line 80 def self.fmap(gen) ->(rantly) do yield gen.call(rantly) end end
Given a predicate, returns a built-in generator if one exists. @param pred @return [Proc] built-in generator for pred @return nil if no built-in generator found @see github.com/abargnesi/rantly Rantly
# File lib/speculation/gen.rb, line 55 def self.gen_for_pred(pred) if pred.is_a?(Set) ->(r) { r.choose(*pred) } else GEN_BUILTINS[pred] end end
@param gen [Proc] Rantly generator @param limit [Integer] specifies how many times `gen` can fail to produce a valid value. @return single value using gen @see github.com/abargnesi/rantly Rantly
# File lib/speculation/gen.rb, line 37 def self.generate(gen, limit = 100) Rantly.value(limit, &gen) end
Generate `n` values using `gen` @param gen [Proc] Rantly generator @param limit [Integer] specifies how many times `gen` can fail to produce a valid value. @return [Array] array of generated values using gne @see github.com/abargnesi/rantly Rantly
# File lib/speculation/gen.rb, line 46 def self.sample(gen, n = 10, limit = 100) Rantly.map(n, limit, &gen) end
Adds pred block as a Rantly `guard` to generator `gen`. @param gen [Proc] @yield generated value @return [Proc] @see github.com/abargnesi/rantly Rantly
# File lib/speculation/gen.rb, line 25 def self.such_that(gen) raise ArgumentError, "block required" unless block_given? ->(rantly) do gen.call(rantly).tap { |val| rantly.guard(yield(val)) } end end
@private
# File lib/speculation/gen.rb, line 73 def self.tuple(*generators) ->(r) do generators.map { |g| g.call(r) } end end