pickup 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/pickup.rb +29 -31
- data/lib/pickup/version.rb +1 -1
- data/spec/pickup/pickup_spec.rb +13 -0
- metadata +3 -3
data/lib/pickup.rb
CHANGED
@@ -25,9 +25,26 @@ class Pickup
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
class CircleIterator
|
29
|
+
def initialize(obj)
|
30
|
+
@obj = obj.dup
|
31
|
+
end
|
32
|
+
|
33
|
+
def each
|
34
|
+
start = 0
|
35
|
+
until @obj.empty?
|
36
|
+
@obj.each do |item, weight|
|
37
|
+
start += weight
|
38
|
+
if yield([item, start])
|
39
|
+
@obj.delete item
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
28
46
|
class MappedList
|
29
|
-
|
30
|
-
attr_reader :list, :func, :uniq, :max
|
47
|
+
attr_reader :list, :func, :uniq
|
31
48
|
|
32
49
|
def initialize(list, func, uniq=false)
|
33
50
|
@func = func
|
@@ -37,43 +54,18 @@ class Pickup
|
|
37
54
|
end
|
38
55
|
|
39
56
|
def each(&blk)
|
40
|
-
|
41
|
-
item = nil
|
42
|
-
drop = false
|
43
|
-
while true do
|
44
|
-
item ||= item_iterator.call(drop)
|
45
|
-
drop = false
|
57
|
+
CircleIterator.new(@list).each do |item|
|
46
58
|
if uniq
|
47
|
-
|
48
|
-
item = nil
|
59
|
+
true if yield item
|
49
60
|
else
|
50
|
-
|
61
|
+
nil while yield(item)
|
51
62
|
end
|
52
63
|
end
|
53
64
|
end
|
54
65
|
|
55
|
-
def next_item
|
56
|
-
dup = list.dup
|
57
|
-
start = 0
|
58
|
-
enum = dup.to_enum
|
59
|
-
item = nil
|
60
|
-
Proc.new do |drop|
|
61
|
-
dup.delete item if drop
|
62
|
-
item = begin
|
63
|
-
enum.next
|
64
|
-
rescue StopIteration => e
|
65
|
-
enum = dup.to_enum
|
66
|
-
enum.next
|
67
|
-
end
|
68
|
-
start += item[1]
|
69
|
-
item[1] = start
|
70
|
-
item
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
66
|
def random(count)
|
75
67
|
raise "List is shorter then count of items you want to get" if uniq && list.size < count
|
76
|
-
nums = count.times.map{ func.call(
|
68
|
+
nums = count.times.map{ rand(func.call(max)) }.sort
|
77
69
|
get_random_items(nums)
|
78
70
|
end
|
79
71
|
|
@@ -92,5 +84,11 @@ class Pickup
|
|
92
84
|
end
|
93
85
|
items
|
94
86
|
end
|
87
|
+
|
88
|
+
def max
|
89
|
+
@max ||= begin
|
90
|
+
list.inject(0){ |mx, item| mx += item[1]}
|
91
|
+
end
|
92
|
+
end
|
95
93
|
end
|
96
94
|
end
|
data/lib/pickup/version.rb
CHANGED
data/spec/pickup/pickup_spec.rb
CHANGED
@@ -38,9 +38,17 @@ describe Pickup do
|
|
38
38
|
@ml2.get_random_items([0]).first.must_equal "selmon"
|
39
39
|
end
|
40
40
|
|
41
|
+
it "should return crucian 3 times for uniq pickup" do
|
42
|
+
@ml2.get_random_items([7, 7, 7]).must_equal ["crucian", "crucian", "crucian"]
|
43
|
+
end
|
44
|
+
|
41
45
|
it "should return item from the beginning after end of list for uniq pickup" do
|
42
46
|
@ml.get_random_items([20, 20, 20, 20]).must_equal ["sturgeon", "gudgeon", "minnow", "selmon"]
|
43
47
|
end
|
48
|
+
|
49
|
+
it "should return right max" do
|
50
|
+
@ml.max.must_equal 52
|
51
|
+
end
|
44
52
|
end
|
45
53
|
|
46
54
|
it "should take 7 different fish" do
|
@@ -51,4 +59,9 @@ describe Pickup do
|
|
51
59
|
it "should raise an exception" do
|
52
60
|
proc{ items = @pickup2.pick(8) }.must_raise RuntimeError
|
53
61
|
end
|
62
|
+
|
63
|
+
it "should return include most wegtful item (but not always - sometimes it will fail)" do
|
64
|
+
items = @pickup2.pick(2){ |v| v**20 }
|
65
|
+
(items.include? "minnow").must_equal true
|
66
|
+
end
|
54
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pickup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Pickup helps you to pick item from collection by it's weight/probability
|
15
15
|
email:
|
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
48
|
version: '0'
|
49
49
|
requirements: []
|
50
50
|
rubyforge_project:
|
51
|
-
rubygems_version: 1.8.
|
51
|
+
rubygems_version: 1.8.23
|
52
52
|
signing_key:
|
53
53
|
specification_version: 3
|
54
54
|
summary: Pickup helps you to pick item from collection by it's weight/probability
|