Module: Quick::Sampler::DSL::SimpleCombinators
- Included in:
- Quick::Sampler::DSL
- Defined in:
- lib/quick/sampler/dsl/simple_combinators.rb
Overview
DSL methods that allow to combine samplers in various ways.
Recursive samplers
Some of the combinators are recursive: given a nested structure of Arrays and Hashes
containing samplers and non-sampler values they would produce an analogous structure
where samplers are replaced by their #next value.
Instance Method Summary collapse
-
#hash_like(template) ⇒ Quick::Sampler<Hash>
Sampler of hashe's that in turn may contain
Arrays,Hashes andQuick::Samplers. -
#list_like(*args) ⇒ Quick::Sampler
Sampler of arbitrary nested structures made up of
Arrays,Hashes,Quick::Samplers and non-sampler values. -
#list_of(sampler, size: 1..10) ⇒ Quick::Sampler
Sampler of uniform arrays.
-
#object_like(the_class, *args) ⇒ Object
Arbitrary object sampler.
-
#one_of(*args) ⇒ Quick::Sampler
A sampler that recursively samples on of the arguments at random.
-
#one_of_weighted(expression_weights) ⇒ Quick::Sampler
A sampler that recursively samples on of the expressions at random, with likelyhood of picking one of the expressions depends on its weight.
-
#pick_from(source) ⇒ Quick::Sampler
A sampler producing values from the range or array.
-
#send_to(*args) ⇒ Quick::Sampler
Sampler of arbitrary message send ("method call") results.
Instance Method Details
#hash_like(template) ⇒ Quick::Sampler<Hash>
Sampler of hashe's that in turn may contain Arrays, Hashes and Quick::Samplers.
75 76 77 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 75 def hash_like template send_to list_like(template), :first end |
#list_like(*args) ⇒ Quick::Sampler
Sampler of arbitrary nested structures made up of Arrays, Hashes, Quick::Samplers and
non-sampler values
66 67 68 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 66 def list_like *args feed { args.map { |arg| recursive_sample(arg) } } end |
#list_of(sampler, size: 1..10) ⇒ Quick::Sampler
Sampler of uniform arrays
54 55 56 57 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 54 def list_of sampler, size: 1..10 size = pick_from(size) if Range === size send_to(sampler, :first, size) end |
#object_like(the_class, *args) ⇒ Object
Arbitrary object sampler.
113 114 115 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 113 def object_like the_class, *args send_to(the_class, :new, *args) end |
#one_of(*args) ⇒ Quick::Sampler
Returns a sampler that recursively samples on of the arguments at random.
25 26 27 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 25 def one_of *args feed { recursive_sample(args.sample) } end |
#one_of_weighted(expression_weights) ⇒ Quick::Sampler
Returns a sampler that recursively samples on of the expressions at random, with likelyhood of picking one of the expressions depends on its weight.
32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 32 def one_of_weighted expression_weights total_weight, expressions = expression_weights .reduce([0, {}]) { |(total_weight, expressions), (expression, weight)| total_weight += weight [total_weight, expressions.merge(total_weight => expression)] } feed { dice = rand * total_weight weight_class = expressions.keys.find{|w| dice < w} recursive_sample(expressions[weight_class]) } end |
#pick_from(source) ⇒ Quick::Sampler
Returns a sampler producing values from the range or array.
14 15 16 17 18 19 20 21 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 14 def pick_from source case source when Range feed { rand(source) } else feed { source.to_a.sample } end end |
#send_to(recipient, message, *args) ⇒ Quick::Sampler #send_to(sampler) ⇒ Quick::Sampler
Sampler of arbitrary message send ("method call") results
95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 95 def send_to *args call_sampler = if args.count > 1 list_like *args else args.first end feed { object, , *args = call_sampler.next object.send( , *args ) } end |