module Speculation::Gen

Constants

GEN_BUILTINS

@private

Public Class Methods

delay(&block) click to toggle source

@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
fmap(gen) { |call| ... } click to toggle source

@private

# File lib/speculation/gen.rb, line 80
def self.fmap(gen)
  ->(rantly) do
    yield gen.call(rantly)
  end
end
gen_for_pred(pred) click to toggle source

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
generate(gen, limit = 100) click to toggle source

@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
sample(gen, n = 10, limit = 100) click to toggle source

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
such_that(gen) { |val| ... } click to toggle source

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
tuple(*generators) click to toggle source

@private

# File lib/speculation/gen.rb, line 73
def self.tuple(*generators)
  ->(r) do
    generators.map { |g| g.call(r) }
  end
end