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
-
#combine(*samplers) {|samples| ... } ⇒ Quick::Sampler
Custom sampler combinator.
-
#hash_like(template) ⇒ Quick::Sampler<Hash>
Sampler of hashe's that in turn may contain
Array
s,Hash
es andQuick::Sampler
s. -
#list_like(*args) ⇒ Quick::Sampler
Sampler of arbitrary nested structures made up of
Array
s,Hash
es,Quick::Sampler
s and non-sampler values. -
#list_of(sampler, size: 1..10) ⇒ Quick::Sampler
Sampler of uniform arrays.
-
#merge(*samplers) ⇒ Quick::Sampler<Hash>
Sampler of merged hashes.
-
#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
#combine(*samplers) {|samples| ... } ⇒ Quick::Sampler
Custom sampler combinator
combine
allows to implement a custom combination of samplers: the
method expects individual samplers as arguments and the combination
implementation as a block. The resulting sampler will sample each of
the supplied sub-samplers, pass the sampled values to the block and emit
block result as combined sample.
146 147 148 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 146 def combine *samplers, &block list_like(*samplers).map(&block) end |
#hash_like(template) ⇒ Quick::Sampler<Hash>
Sampler of hashe's that in turn may contain Array
s, Hash
es and Quick::Sampler
s.
88 89 90 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 88 def hash_like template send_to list_like(template), :first end |
#list_like(*args) ⇒ Quick::Sampler
Sampler of arbitrary nested structures made up of Array
s, Hash
es, Quick::Sampler
s and
non-sampler values
79 80 81 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 79 def list_like *args feed { args.map { |arg| recursive_sample(arg) } } end |
#list_of(sampler, size: 1..10) ⇒ Quick::Sampler
Sampler of uniform arrays
58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 58 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 |
#merge(*samplers) ⇒ Quick::Sampler<Hash>
Sampler of merged hashes
156 157 158 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 156 def merge *samplers combine(*samplers) { |hashes| hashes.reduce(:merge) } end |
#object_like(the_class, *args) ⇒ Object
Arbitrary object sampler.
126 127 128 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 126 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 45 46 47 48 |
# 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)| if weight > 0 total_weight += weight [total_weight, expressions.merge(total_weight => expression)] else [total_weight, expressions] end } 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
108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 108 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 |