riffle 0.0.1 → 1.0.1
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.
- checksums.yaml +4 -4
- data/lib/riffle.rb +1 -0
- data/lib/riffle/array.rb +58 -0
- data/lib/riffle/core_ext/array/riffle.rb +2 -32
- data/lib/riffle/version.rb +1 -1
- data/spec/array_spec.rb +24 -76
- data/spec/riffle_spec.rb +81 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f072f9e01cd3dae017947eca483b6edb3ddbebd
|
4
|
+
data.tar.gz: 6cc6682bc9332e96f873745676f98b8489f0071f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b29b6efd71e529a0183447b10fbfc261f7aab102264491b5dd4738ed555c9cfbef3f9e6f7732c6791e4815ca463ad7bb807abb4403c5279700184595424fb6d4
|
7
|
+
data.tar.gz: 104592ccc714b3571bc754d86954d109efbd46af9275b02b7382c26e9eb9394c112dc9aa2e7075ff2190e5ab414ccadb7dc9910f33a1833d475130bc0af490a1
|
data/lib/riffle.rb
CHANGED
data/lib/riffle/array.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
module Riffle
|
3
|
+
module Array
|
4
|
+
def riffle(*args)
|
5
|
+
result = []
|
6
|
+
|
7
|
+
# handle empty or insufficient args
|
8
|
+
if self == ::Array && args.length < 2
|
9
|
+
return args.empty? ? [] : args.first
|
10
|
+
elsif self.is_a?(::Array) && args.empty?
|
11
|
+
return self
|
12
|
+
end
|
13
|
+
|
14
|
+
opts = get_opts_from_args(args)
|
15
|
+
|
16
|
+
opts[:range] ||= (1..3)
|
17
|
+
|
18
|
+
unless args.select { |a| !a.is_a? ::Array }.empty?
|
19
|
+
raise ArgumentError, "All arguments must be of type `Array`"
|
20
|
+
end
|
21
|
+
|
22
|
+
# insert self at front of args list if self is an Array instance
|
23
|
+
args.unshift self if self.is_a?(::Array)
|
24
|
+
|
25
|
+
# Random.new(nil) explodes for some reason...
|
26
|
+
if opts[:seed].nil?
|
27
|
+
prng = Random.new
|
28
|
+
else
|
29
|
+
prng = Random.new(opts[:seed])
|
30
|
+
end
|
31
|
+
|
32
|
+
until args.flatten.empty?
|
33
|
+
args.each_with_index do |arg, i|
|
34
|
+
group_size = prng.rand(opts[:range])
|
35
|
+
if arg.length < group_size
|
36
|
+
result.concat arg
|
37
|
+
args[i] = []
|
38
|
+
else
|
39
|
+
result.concat arg.take(group_size)
|
40
|
+
args[i] = arg.drop group_size
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def get_opts_from_args(args)
|
51
|
+
opts_passed?(args) ? args.pop : {}
|
52
|
+
end
|
53
|
+
|
54
|
+
def opts_passed?(args)
|
55
|
+
args.length > 1 && args.last.is_a?(Hash)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -1,35 +1,5 @@
|
|
1
1
|
|
2
2
|
class Array
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
return self if args.empty?
|
7
|
-
|
8
|
-
opts = args.pop if args.length > 1 && args.last.is_a?(Hash)
|
9
|
-
|
10
|
-
min_group_size = (opts && opts[:min_group_size]) || 1
|
11
|
-
max_group_size = (opts && opts[:max_group_size]) || 3
|
12
|
-
|
13
|
-
# insert self at front of args list
|
14
|
-
args.unshift self
|
15
|
-
|
16
|
-
unless args.select { |a| !a.is_a? Array }.empty?
|
17
|
-
raise ArgumentError, "All arguments must be of type `Array`"
|
18
|
-
end
|
19
|
-
|
20
|
-
until args.flatten.empty?
|
21
|
-
args.each_with_index do |arg, i|
|
22
|
-
group_size = rand(min_group_size..max_group_size)
|
23
|
-
if arg.length < group_size
|
24
|
-
result.concat arg
|
25
|
-
args[i] = []
|
26
|
-
else
|
27
|
-
result.concat arg.take(group_size)
|
28
|
-
args[i] = arg.drop group_size
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
result
|
34
|
-
end
|
3
|
+
include Riffle::Array
|
4
|
+
extend Riffle::Array
|
35
5
|
end
|
data/lib/riffle/version.rb
CHANGED
data/spec/array_spec.rb
CHANGED
@@ -1,81 +1,29 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Array do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
numbers = [1, 2, 3, 4, 5, 6]
|
29
|
-
letters = %w(a b c d e f)
|
30
|
-
symbols = [:foo, :bar, :baz, :qux]
|
31
|
-
result = numbers.riffle letters, symbols
|
32
|
-
|
33
|
-
result.length.should == numbers.length +
|
34
|
-
letters.length +
|
35
|
-
symbols.length
|
36
|
-
|
37
|
-
# filtering out integers from the result should be exactly equal to the
|
38
|
-
# original `numbers` array. particularly the order should be the same
|
39
|
-
result.select { |r| r.is_a? Integer }.should.eql? numbers
|
40
|
-
|
41
|
-
# filtering out strings from the result should be exactly equal to the
|
42
|
-
# original `letters` array. particularly the order should be the same
|
43
|
-
result.select { |r| r.is_a? String }.should.eql? letters
|
44
|
-
|
45
|
-
# filtering out strings from the result should be exactly equal to the
|
46
|
-
# original `letters` array. particularly the order should be the same
|
47
|
-
result.select { |r| r.is_a? Symbol }.should.eql? symbols
|
48
|
-
end
|
49
|
-
|
50
|
-
it "merges all argument arrays while maintaining the order of the original arrays in relation to themselves" do
|
51
|
-
numbers = [1, 2, 3, 4, 5, 6]
|
52
|
-
letters = %w(a b c d e f)
|
53
|
-
result = numbers.riffle letters
|
54
|
-
|
55
|
-
result.length.should == numbers.length + letters.length
|
56
|
-
|
57
|
-
# filtering out integers from the result should be exactly equal to the
|
58
|
-
# original `numbers` array. particularly the order should be the same
|
59
|
-
result.select { |r| r.is_a? Integer }.should.eql? numbers
|
60
|
-
|
61
|
-
# filtering out strings from the result should be exactly equal to the
|
62
|
-
# original `letters` array. particularly the order should be the same
|
63
|
-
result.select { |r| r.is_a? String }.should.eql? letters
|
64
|
-
end
|
65
|
-
|
66
|
-
it "maintains the first element in the array on which `riffle` was called" do
|
67
|
-
a = [1, 2, 3]
|
68
|
-
b = %w(a b c)
|
69
|
-
a.riffle(b).first.should == a.first
|
70
|
-
end
|
71
|
-
|
72
|
-
it "supports defining a min and max group size through an opts Hash passed as the last arg" do
|
73
|
-
a = [1, 2, 3, 4, 5, 6, 7, 8]
|
74
|
-
b = %w(a b c d e f g h)
|
75
|
-
r = a.riffle(b, { min_group_size: 2, max_group_size: 2 })
|
76
|
-
r.slice(0..1).each { |x| x.is_a?(Integer).should be_true }
|
77
|
-
r.slice(2..3).each { |x| x.is_a?(String).should be_true }
|
78
|
-
r.slice(6..7).each { |x| x.is_a?(String).should be_true }
|
79
|
-
r.slice(8..9).each { |x| x.is_a?(Integer).should be_true }
|
4
|
+
context "#riffle" do
|
5
|
+
it "defines Array#riffle" do
|
6
|
+
[].respond_to?(:riffle).should be_true
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns self if no args are passed" do
|
10
|
+
a = [1, 2, 3]
|
11
|
+
a.riffle.should == a
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context ".riffle" do
|
16
|
+
it "defines Array.riffle" do
|
17
|
+
Array.respond_to?(:riffle).should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns [] if no args are passed" do
|
21
|
+
Array.riffle.should == []
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns the arg if only one arg is passed" do
|
25
|
+
a = [1,2,3]
|
26
|
+
Array.riffle(a).should == a
|
27
|
+
end
|
80
28
|
end
|
81
29
|
end
|
data/spec/riffle_spec.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Riffle do
|
4
|
+
it "requires all arguments to be of type `Array`, except when the last arg is an opts Hash" do
|
5
|
+
expect { [].riffle 1 }.to raise_error(ArgumentError)
|
6
|
+
expect { [].riffle [1], :foo }.to raise_error(ArgumentError)
|
7
|
+
expect { [].riffle({}, [1]) }.to raise_error(ArgumentError)
|
8
|
+
|
9
|
+
# allow an opts Hash to be passed as the last arg
|
10
|
+
expect { [].riffle [1], { min_group_size: 1 } }.to_not raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it "does not raise exceptions when empty args are passed" do
|
14
|
+
expect { [].riffle [], [] }.to_not raise_error
|
15
|
+
[].riffle([], []).should be_empty
|
16
|
+
end
|
17
|
+
|
18
|
+
it "supports more than two arguments" do
|
19
|
+
numbers = [1, 2, 3, 4, 5, 6]
|
20
|
+
letters = %w(a b c d e f)
|
21
|
+
symbols = [:foo, :bar, :baz, :qux]
|
22
|
+
result = numbers.riffle letters, symbols
|
23
|
+
|
24
|
+
result.length.should == numbers.length +
|
25
|
+
letters.length +
|
26
|
+
symbols.length
|
27
|
+
|
28
|
+
# filtering out integers from the result should be exactly equal to the
|
29
|
+
# original `numbers` array. particularly the order should be the same
|
30
|
+
result.select { |r| r.is_a? Integer }.should.eql? numbers
|
31
|
+
|
32
|
+
# filtering out strings from the result should be exactly equal to the
|
33
|
+
# original `letters` array. particularly the order should be the same
|
34
|
+
result.select { |r| r.is_a? String }.should.eql? letters
|
35
|
+
|
36
|
+
# filtering out strings from the result should be exactly equal to the
|
37
|
+
# original `letters` array. particularly the order should be the same
|
38
|
+
result.select { |r| r.is_a? Symbol }.should.eql? symbols
|
39
|
+
end
|
40
|
+
|
41
|
+
it "merges all argument arrays while maintaining the order of the original arrays in relation to themselves" do
|
42
|
+
numbers = [1, 2, 3, 4, 5, 6]
|
43
|
+
letters = %w(a b c d e f)
|
44
|
+
result = numbers.riffle letters
|
45
|
+
|
46
|
+
result.length.should == numbers.length + letters.length
|
47
|
+
|
48
|
+
# filtering out integers from the result should be exactly equal to the
|
49
|
+
# original `numbers` array. particularly the order should be the same
|
50
|
+
result.select { |r| r.is_a? Integer }.should.eql? numbers
|
51
|
+
|
52
|
+
# filtering out strings from the result should be exactly equal to the
|
53
|
+
# original `letters` array. particularly the order should be the same
|
54
|
+
result.select { |r| r.is_a? String }.should.eql? letters
|
55
|
+
end
|
56
|
+
|
57
|
+
it "maintains the first element in the array on which `riffle` was called" do
|
58
|
+
a = [1, 2, 3]
|
59
|
+
b = %w(a b c)
|
60
|
+
a.riffle(b).first.should == a.first
|
61
|
+
end
|
62
|
+
|
63
|
+
it "supports defining a min and max group size through an opts Hash passed as the last arg" do
|
64
|
+
a = [1, 2, 3, 4, 5, 6, 7, 8]
|
65
|
+
b = %w(a b c d e f g h)
|
66
|
+
r = a.riffle(b, { range: (2..2) })
|
67
|
+
r.slice(0..1).each { |x| x.is_a?(Integer).should be_true }
|
68
|
+
r.slice(2..3).each { |x| x.is_a?(String).should be_true }
|
69
|
+
r.slice(6..7).each { |x| x.is_a?(String).should be_true }
|
70
|
+
r.slice(8..9).each { |x| x.is_a?(Integer).should be_true }
|
71
|
+
end
|
72
|
+
|
73
|
+
it "supports passing a custom seed" do
|
74
|
+
a = [1, 2, 3, 4, 5, 6, 7, 8]
|
75
|
+
b = %w(a b c d e f g h)
|
76
|
+
r1 = Array.riffle(a, b, seed: 123)
|
77
|
+
r2 = Array.riffle(a, b, seed: 123)
|
78
|
+
expect(r1).to eql(r2)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riffle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Stephens
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,10 +66,12 @@ files:
|
|
66
66
|
- README.md
|
67
67
|
- Rakefile
|
68
68
|
- lib/riffle.rb
|
69
|
+
- lib/riffle/array.rb
|
69
70
|
- lib/riffle/core_ext/array/riffle.rb
|
70
71
|
- lib/riffle/version.rb
|
71
72
|
- riffle.gemspec
|
72
73
|
- spec/array_spec.rb
|
74
|
+
- spec/riffle_spec.rb
|
73
75
|
- spec/spec_helper.rb
|
74
76
|
homepage: http://github.com/jordanstephens/riffle
|
75
77
|
licenses:
|
@@ -91,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
93
|
version: '0'
|
92
94
|
requirements: []
|
93
95
|
rubyforge_project:
|
94
|
-
rubygems_version: 2.0.
|
96
|
+
rubygems_version: 2.0.3
|
95
97
|
signing_key:
|
96
98
|
specification_version: 4
|
97
99
|
summary: riffle multiple Arrays by selecting a random number of items from each and
|
@@ -99,5 +101,5 @@ summary: riffle multiple Arrays by selecting a random number of items from each
|
|
99
101
|
have been merged.
|
100
102
|
test_files:
|
101
103
|
- spec/array_spec.rb
|
104
|
+
- spec/riffle_spec.rb
|
102
105
|
- spec/spec_helper.rb
|
103
|
-
has_rdoc:
|