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.
84 85 86 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 84 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
75 76 77 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 75 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 58 59 60 61 62 63 64 65 66 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 54 def list_of sampler, size: 1..10 size = case size when Quick::Sampler size when Range pick_from(size) when Numeric const(size.to_i) else raise "Cant use #{size.inspect} as size" end feed { sampler.first(size.next) } end |
#object_like(the_class, *args) ⇒ Object
Arbitrary object sampler.
122 123 124 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 122 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
104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 104 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 |