multi_hash_iterator 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/README.markdown +24 -0
- data/Rakefile +14 -0
- data/lib/multi_hash_iterator.rb +42 -0
- data/multi_hash_iterator.gemspec +21 -0
- data/test/helper.rb +6 -0
- data/test/test_multihashiterator.rb +123 -0
- metadata +93 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d7fd2cda2d252b6ceabca391554623650693b922
|
4
|
+
data.tar.gz: 8a75902056eab48087f7ce9376cd2b3dce1d6f5a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a6956f72d5bbb6cc44be93e5512efbdd7448240e913d80dc62d94114943b724d1a950abc0b31a7e06d55b33c24984874fbf87316cb059adca7dfe6fcb46dbaff
|
7
|
+
data.tar.gz: 9359f88330097077caa3eb4c87cd1f9591f60b1e0608444792d9cda026f1e9a53640f5f2c0fbbb337676ecfc32609a7372bce80d23ad6c5b9a33139b8fb551ac
|
data/README.markdown
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# multi_hash_iterator
|
2
|
+
|
3
|
+
Iterate through multiple hashmaps. Values from multiple hashmaps are presented
|
4
|
+
in an array. If a hash does not contain a value for that key, a `nil`
|
5
|
+
will be used. See Example.
|
6
|
+
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
gem install multi_hash_iterator
|
11
|
+
|
12
|
+
|
13
|
+
## Example
|
14
|
+
|
15
|
+
require 'multi_hash_iterator'
|
16
|
+
|
17
|
+
h1 = { a: 1, c: 11 }
|
18
|
+
h2 = { a: 2, b: 2 }
|
19
|
+
h4 = { a: 3, c: 10 }
|
20
|
+
multi_hash(h1, h2, h3).each do |k, v|
|
21
|
+
# 1st iteration: k = a, v = [1, 2, 3]
|
22
|
+
# 2nd iteration: k = c, v = [11, nil, 10]
|
23
|
+
# 3rd iteration: k = b, v = [nil, 2, nil]
|
24
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
|
3
|
+
task :default => "test"
|
4
|
+
|
5
|
+
Rake::TestTask.new do |t|
|
6
|
+
t.description = "Run tests"
|
7
|
+
t.name = "test"
|
8
|
+
t.pattern = "./test/**/*.rb"
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Build the gemfile"
|
12
|
+
task :build do
|
13
|
+
`gem build multi_hash_iterator.gemspec`
|
14
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Multi Hash allows you to iterate through multiple hashes at the same time.
|
2
|
+
# The values will be an array of values from each hash. If a hash contains
|
3
|
+
# no value for the key, it will be nil.
|
4
|
+
#
|
5
|
+
class MultiHash
|
6
|
+
|
7
|
+
def initialize *hashes
|
8
|
+
@hashes = hashes
|
9
|
+
@final_hash = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
# Enumerate for each key.
|
13
|
+
# Returns an enumerator if block is not present
|
14
|
+
#
|
15
|
+
def each
|
16
|
+
return enum_for(:each) unless block_given?
|
17
|
+
|
18
|
+
count = @hashes.length
|
19
|
+
count.times do |i|
|
20
|
+
@hashes[i].each do |key, v|
|
21
|
+
next if @final_hash[key]
|
22
|
+
|
23
|
+
values = [].fill(nil, 0, i)
|
24
|
+
values << v
|
25
|
+
((i+1)...count).each do |j|
|
26
|
+
values << @hashes[j][key]
|
27
|
+
end
|
28
|
+
|
29
|
+
yield key, values if block_given?
|
30
|
+
@final_hash[key] = values
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
# Shortcut to do the iteration
|
39
|
+
#
|
40
|
+
def multi_hash *hashes
|
41
|
+
MultiHash.new(*hashes).each
|
42
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require './lib/multi_hash_iterator'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "multi_hash_iterator"
|
5
|
+
s.version = "0.1.0"
|
6
|
+
s.authors = ["Albert Tedja"]
|
7
|
+
s.email = "nicho_tedja@yahoo.com"
|
8
|
+
s.homepage = "https://github.com/atedja/multi_hash_iterator"
|
9
|
+
s.summary = "Iterate through multiple hashmaps at once"
|
10
|
+
s.description = "multi_hash_iterator allows you iterate through multiple hashmaps at once"
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- {test}/*`.split("\n")
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
|
16
|
+
s.add_development_dependency 'minitest', '~> 5.3'
|
17
|
+
s.add_development_dependency 'mocha', '~> 1.1'
|
18
|
+
s.add_development_dependency 'rake', '~> 10.3'
|
19
|
+
|
20
|
+
s.license = "BSD"
|
21
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require './test/helper.rb'
|
2
|
+
|
3
|
+
class TestMultiHashIterator < Minitest::Test
|
4
|
+
|
5
|
+
|
6
|
+
def test_basic
|
7
|
+
h1 = { a: 1, b: 2, c: 3 }
|
8
|
+
h2 = { a: 2, b: 3 }
|
9
|
+
h3 = { b: 4, d: 6 }
|
10
|
+
mh = MultiHash.new(h1, h2, h3)
|
11
|
+
mh.each do |k, v|
|
12
|
+
if k == :a
|
13
|
+
assert_equal [1, 2, nil], v
|
14
|
+
elsif k == :b
|
15
|
+
assert_equal [2, 3, 4], v
|
16
|
+
elsif k == :c
|
17
|
+
assert_equal [3, nil, nil], v
|
18
|
+
elsif k == :d
|
19
|
+
assert_equal [nil, nil, 6], v
|
20
|
+
else
|
21
|
+
raise "not supposed to happen #{k}, #{v}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_equal({ a: 1, b: 2, c: 3 }, h1)
|
26
|
+
assert_equal({ a: 2, b: 3 }, h2)
|
27
|
+
assert_equal({ b: 4, d: 6 }, h3)
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def test_compound_values
|
32
|
+
h1 = { a: 1, b: 2, c: [100, 200] }
|
33
|
+
h2 = { a: 2, b: "foo" }
|
34
|
+
h3 = { b: { k: 100, v: 200 }, d: 6 }
|
35
|
+
mh = MultiHash.new(h1, h2, h3)
|
36
|
+
mh.each do |k, v|
|
37
|
+
if k == :a
|
38
|
+
assert_equal [1, 2, nil], v
|
39
|
+
elsif k == :b
|
40
|
+
assert_equal [2, "foo", { k: 100, v: 200 }], v
|
41
|
+
elsif k == :c
|
42
|
+
assert_equal [[100, 200], nil, nil], v
|
43
|
+
elsif k == :d
|
44
|
+
assert_equal [nil, nil, 6], v
|
45
|
+
else
|
46
|
+
raise "not supposed to happen #{k}, #{v}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
assert_equal({ a: 1, b: 2, c: [100, 200] }, h1)
|
51
|
+
assert_equal({ a: 2, b: "foo" }, h2)
|
52
|
+
assert_equal({ b: { k: 100, v: 200 }, d: 6 }, h3)
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def test_no_block_should_return_enumerator
|
57
|
+
h1 = { a: 1, b: 2, c: 3 }
|
58
|
+
h2 = { a: 2, b: 3 }
|
59
|
+
h3 = { b: 4, d: 6 }
|
60
|
+
mh = MultiHash.new(h1, h2, h3)
|
61
|
+
e = mh.each
|
62
|
+
assert_equal Enumerator, e.class
|
63
|
+
assert_equal [:a, [1, 2, nil]], e.next
|
64
|
+
assert_equal [:b, [2, 3, 4]], e.next
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def test_enumerator_next
|
69
|
+
h1 = { a: 1, b: 2, c: 3 }
|
70
|
+
h2 = { a: 2, b: 3 }
|
71
|
+
h3 = { b: 4, d: 6 }
|
72
|
+
mh = MultiHash.new(h1, h2, h3)
|
73
|
+
e = mh.each
|
74
|
+
assert_equal [:a, [1, 2, nil]], e.next
|
75
|
+
assert_equal [:b, [2, 3, 4]], e.next
|
76
|
+
assert_equal [:c, [3, nil, nil]], e.next
|
77
|
+
assert_equal [:d, [nil, nil, 6]], e.next
|
78
|
+
assert_raises StopIteration do
|
79
|
+
e.next
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def test_shortcut_function
|
85
|
+
h1 = { a: 1, b: 2, c: 3 }
|
86
|
+
h2 = { a: 2, b: 3 }
|
87
|
+
h3 = { b: 4, d: 6 }
|
88
|
+
multi_hash(h1, h2, h3) do |k, v|
|
89
|
+
if k == :a
|
90
|
+
assert_equal [1, 2, nil], v
|
91
|
+
elsif k == :b
|
92
|
+
assert_equal [2, 3, 4], v
|
93
|
+
elsif k == :c
|
94
|
+
assert_equal [3, nil, nil], v
|
95
|
+
elsif k == :d
|
96
|
+
assert_equal [nil, nil, 6], v
|
97
|
+
else
|
98
|
+
raise "not supposed to happen #{k}, #{v}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
assert_equal({ a: 1, b: 2, c: 3 }, h1)
|
103
|
+
assert_equal({ a: 2, b: 3 }, h2)
|
104
|
+
assert_equal({ b: 4, d: 6 }, h3)
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def test_shortcut_function_with_enumerator_next
|
109
|
+
h1 = { a: 1, b: 2, c: 3 }
|
110
|
+
h2 = { a: 2, b: 3 }
|
111
|
+
h3 = { b: 4, d: 6 }
|
112
|
+
e = multi_hash(h1, h2, h3)
|
113
|
+
assert_equal [:a, [1, 2, nil]], e.next
|
114
|
+
assert_equal [:b, [2, 3, 4]], e.next
|
115
|
+
assert_equal [:c, [3, nil, nil]], e.next
|
116
|
+
assert_equal [:d, [nil, nil, 6]], e.next
|
117
|
+
assert_raises StopIteration do
|
118
|
+
e.next
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: multi_hash_iterator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Albert Tedja
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mocha
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.3'
|
55
|
+
description: multi_hash_iterator allows you iterate through multiple hashmaps at once
|
56
|
+
email: nicho_tedja@yahoo.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- ".gitignore"
|
62
|
+
- README.markdown
|
63
|
+
- Rakefile
|
64
|
+
- lib/multi_hash_iterator.rb
|
65
|
+
- multi_hash_iterator.gemspec
|
66
|
+
- test/helper.rb
|
67
|
+
- test/test_multihashiterator.rb
|
68
|
+
homepage: https://github.com/atedja/multi_hash_iterator
|
69
|
+
licenses:
|
70
|
+
- BSD
|
71
|
+
metadata: {}
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
requirements: []
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 2.4.5
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: Iterate through multiple hashmaps at once
|
92
|
+
test_files: []
|
93
|
+
has_rdoc:
|