functions 0.0.15 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/multi_hash_map_recursive.rb +19 -0
- data/lib/functions/prelude_enumerable/hash.rb +68 -2
- data/lib/functions/version.rb +1 -1
- data/spec/prelude_enumerable_spec.rb +69 -2
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9f07df0e596091bea7d6f8f57d4c877faf3d9bd
|
4
|
+
data.tar.gz: 0642fda991a8aa220b809d22c474f9af47b4ed24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea82380d54e0fbb0469c88f9d009662ef803e3d841f9638a894a30d964752b7f94eb0b68c7c04f86d965333cb4182786c322a4fec9d744fc47f41ab82786977e
|
7
|
+
data.tar.gz: 6c3c534d39be490690e25761d09193355bc02a1496404fa222871eb5f71290b7e878f510839e690fb849eb6a927633e063cd8f5627c9327ddfc9290d9bab18a0
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '../lib/functions'
|
2
|
+
|
3
|
+
folders = {
|
4
|
+
'main[2]' => { 'child[3]' => 'leaf'}
|
5
|
+
}
|
6
|
+
|
7
|
+
def multiply_folder(k,v)
|
8
|
+
match = k.match(/(.*)\[(\d+)\]/)
|
9
|
+
k, count = match ? [match[1], match[2].to_i] : [k, nil]
|
10
|
+
if count
|
11
|
+
(1..count).map { |i| ["#{k}_#{i}",v] }
|
12
|
+
else
|
13
|
+
[[k,v]]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
multiplied = folders.multi_map_hash_recursive &multiply_folder
|
18
|
+
|
19
|
+
puts multiplied
|
@@ -8,8 +8,74 @@ class Hash
|
|
8
8
|
self.each_with_object({}) { |(k, a), h| b = bs[k]; h[k] = [a, b] if b; h }
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def map_values
|
12
12
|
Hash[self.map{|k, v| [k, yield(v)] }]
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
def map_values_recurse(&b)
|
16
|
+
Hash[self.map{|k, v| [k, v.is_a?(Hash) ? v.map_values_recurse(&b) : b.(v)] }]
|
17
|
+
end
|
18
|
+
|
19
|
+
# definition of maarten
|
20
|
+
# def map_values &blk
|
21
|
+
# res = {}
|
22
|
+
# each {|k,v| res[k] = blk.call(v)}
|
23
|
+
# res
|
24
|
+
# end
|
25
|
+
|
26
|
+
# TODO discuss if we should not map onto array as values can colide
|
27
|
+
def map_keys
|
28
|
+
Hash[self.map{|k, v| [yield(k), v] }]
|
29
|
+
end
|
30
|
+
|
31
|
+
def map_keys_recurse(&b)
|
32
|
+
Hash[self.map{|k, v| [b.(k), v.is_a?(Hash) ? v.map_keys_recurse(&b) : v ] }]
|
33
|
+
end
|
34
|
+
|
35
|
+
# def map_keys
|
36
|
+
# each_with_object({}) { |h, (k,v)| h[yield(k)] = v }
|
37
|
+
# end
|
38
|
+
|
39
|
+
# def map_keys &blk
|
40
|
+
# each_with_object({}) {|h, (k,v)| h[blk.(k)] = v}
|
41
|
+
# end
|
42
|
+
|
43
|
+
# definition of maarten
|
44
|
+
# def map_keys &blk
|
45
|
+
# res = {}
|
46
|
+
# each {|k,v| res[blk.call(k)] = v}
|
47
|
+
# res
|
48
|
+
# end
|
49
|
+
|
50
|
+
# map a hash into a hash
|
51
|
+
def map_hash
|
52
|
+
Hash[ self.map{|k, v| yield(k,v) } ]
|
53
|
+
end
|
54
|
+
|
55
|
+
# map a hash into a hash recursively.
|
56
|
+
# the mapping function needs to check itself wether or not the value is hash and act appropriately
|
57
|
+
def map_recursive(&b)
|
58
|
+
Hash[ self.map{|k, v| b.(k, v.is_a?(Hash) ? v.map_recursive(&b) : v) } ]
|
59
|
+
end
|
60
|
+
|
61
|
+
# map a hash into a hash recursively with a seperate key mapping and value mapping function
|
62
|
+
def map_keys_and_values(km, vm)
|
63
|
+
Hash[ self.map{|k, v| [ km.(k), v.is_a?(Hash) ? v.map_keys_and_values(km, vm) : vm.(v) ] } ]
|
64
|
+
end
|
65
|
+
|
66
|
+
# map a hash into a hash recursively where one key value mapping can be mapped onto multi key value mappings
|
67
|
+
def multi_map(&b)
|
68
|
+
Hash[ self.map{|k, v| b.(k, ( v.is_a?(Hash) ? v.multi_map(&b) : v) ) }.flatten(1) ]
|
69
|
+
end
|
70
|
+
|
71
|
+
# def map_hash &blk
|
72
|
+
# res = {}
|
73
|
+
# each do |k,v|
|
74
|
+
# kk, vv = blk.call(k,v)
|
75
|
+
# res[kk] = vv
|
76
|
+
# end
|
77
|
+
# res
|
78
|
+
# end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
data/lib/functions/version.rb
CHANGED
@@ -57,10 +57,58 @@ describe "enumerable" do
|
|
57
57
|
ad.zip_hash_inner(cb).should eq({})
|
58
58
|
end
|
59
59
|
|
60
|
+
it "map_values" do
|
61
|
+
ab = {a: 1, b: 2}
|
62
|
+
ab.map_values { |x| x*2}.should == {a: 2, b: 4}
|
63
|
+
ab.map_values { |x| x.even? }.should == {a: false, b: true}
|
64
|
+
end
|
65
|
+
|
66
|
+
it "map_values_recurse" do
|
67
|
+
abcde = {a: 1, b: 2, c: { d: 1, e: 0 } }
|
68
|
+
abcde.map_values_recurse { |x| x*2}.should == {a: 2, b: 4, c: { d: 2, e: 0}}
|
69
|
+
abcde .map_values_recurse { |x| x.even? }.should == {a: false, b: true, c: { d:false, e: true}}
|
70
|
+
end
|
71
|
+
|
72
|
+
it "map_keys" do
|
73
|
+
ab = {a: 1, b: 2}
|
74
|
+
ab.map_keys { |k| k.to_s }.should == {"a" => 1, "b" => 2}
|
75
|
+
ab.map_keys { |k| k.to_s[0].ord }.should == { 97 => 1, 98 => 2 }
|
76
|
+
ab.map_keys { |k| k.to_s.length }.should == { 1 => 2 }
|
77
|
+
end
|
78
|
+
|
79
|
+
it "map_keys_recurse" do
|
80
|
+
abcde = {a: 1, b: 2, c: { d: 1, e: 0 } }
|
81
|
+
abcde.map_keys_recurse { |k| k.to_s }.should == {"a" => 1, "b" => 2, "c" => { "d" => 1, "e" => 0 }}
|
82
|
+
end
|
83
|
+
|
60
84
|
it "map_hash" do
|
61
85
|
ab = {a: 1, b: 2}
|
62
|
-
ab.map_hash { |
|
63
|
-
ab.map_hash { |
|
86
|
+
ab.map_hash { |k,v| [k.to_s, v*2] }.should == {"a" => 2, "b" => 4}
|
87
|
+
ab.map_hash { |k,v| [k.to_s[0].ord, v.even?] }.should == {97 => false, 98 => true}
|
88
|
+
ab.map_hash { |k,v| [k.to_s.length, v.even?] }.should == {1 => true}
|
89
|
+
end
|
90
|
+
|
91
|
+
it "map_recursive" do
|
92
|
+
abcde = {a: 1, b: 2, c: { d: 1, e: 0 } }
|
93
|
+
abcde.map_recursive { |k,v| v.is_a?(Hash) ? [k.to_s, v] : [k.to_s, v*2] }.should == {"a" => 2, "b" => 4, "c" => { "d" => 2, "e" => 0 }}
|
94
|
+
abcde.map_recursive { |k,v| v.is_a?(Hash) ? [k.to_s[0].ord, v] : [k.to_s[0].ord, v.even?] }.should == {97 => false, 98 => true, 99 => { 100 => false, 101 => true }}
|
95
|
+
abcde.map_recursive { |k,v| v.is_a?(Hash) ? [k.to_s.length, v] : [k.to_s.length, v.even?] }.should == {1 => true, 1 => { 1=>true } }
|
96
|
+
end
|
97
|
+
|
98
|
+
it "map_keys_and_values" do
|
99
|
+
|
100
|
+
s = ->(x) { x.to_s }
|
101
|
+
s_ord = ->(x) { x.to_s[0].ord }
|
102
|
+
s_length = ->(x) { x.to_s.length }
|
103
|
+
times_2 = ->(x) { x * 2 }
|
104
|
+
even = ->(x) { x.even? }
|
105
|
+
|
106
|
+
abcde = {a: 1, b: 2, c: { d: 1, e: 0 } }
|
107
|
+
|
108
|
+
abcde.map_keys_and_values(s, times_2).should == {"a" => 2, "b" => 4, "c" => { "d" => 2, "e" => 0 }}
|
109
|
+
abcde.map_keys_and_values(s_ord, even).should == {97 => false, 98 => true, 99 => { 100 => false, 101 => true }}
|
110
|
+
abcde.map_keys_and_values(s_length, even).should == {1 => true, 1 => { 1=>true } }
|
111
|
+
|
64
112
|
end
|
65
113
|
|
66
114
|
it "counted_set" do
|
@@ -73,4 +121,23 @@ describe "enumerable" do
|
|
73
121
|
%w(some words are longer then others).grouped_by { |x| x.length > 3 }.should eq([%w(some words longer then others),%w(are)])
|
74
122
|
end
|
75
123
|
|
124
|
+
it "multimap" do
|
125
|
+
|
126
|
+
folders = { 'main[2]' => { 'child[3]' => 'leaf', 'simple' => 'leaf' } }
|
127
|
+
|
128
|
+
multiply_folder = -> (k,v) do
|
129
|
+
match = k.match(/(.*)\[(\d+)\]/)
|
130
|
+
k, count = match ? [match[1], match[2].to_i] : [k, nil]
|
131
|
+
if count
|
132
|
+
(1..count).map { |i| ["#{k}_#{i}",v] }
|
133
|
+
else
|
134
|
+
[[k,v]]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
multiplied = folders.multi_map &multiply_folder
|
139
|
+
multiplied.length.should eq(2)
|
140
|
+
multiplied['main_1'].length.should eq(4)
|
141
|
+
|
142
|
+
end
|
76
143
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: functions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koen Handekyn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: functional programming in ruby
|
14
14
|
email:
|
@@ -17,12 +17,13 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
-
- .gitignore
|
21
|
-
- .rspec
|
20
|
+
- ".gitignore"
|
21
|
+
- ".rspec"
|
22
22
|
- Gemfile
|
23
23
|
- LICENSE.txt
|
24
24
|
- README.md
|
25
25
|
- Rakefile
|
26
|
+
- examples/multi_hash_map_recursive.rb
|
26
27
|
- examples/prelude_lambda.rb
|
27
28
|
- examples/spec/prelude_lambda_spec.rb
|
28
29
|
- functions.gemspec
|
@@ -54,17 +55,17 @@ require_paths:
|
|
54
55
|
- lib
|
55
56
|
required_ruby_version: !ruby/object:Gem::Requirement
|
56
57
|
requirements:
|
57
|
-
- -
|
58
|
+
- - ">="
|
58
59
|
- !ruby/object:Gem::Version
|
59
60
|
version: '0'
|
60
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
62
|
requirements:
|
62
|
-
- -
|
63
|
+
- - ">="
|
63
64
|
- !ruby/object:Gem::Version
|
64
65
|
version: '0'
|
65
66
|
requirements: []
|
66
67
|
rubyforge_project:
|
67
|
-
rubygems_version: 2.
|
68
|
+
rubygems_version: 2.2.1
|
68
69
|
signing_key:
|
69
70
|
specification_version: 4
|
70
71
|
summary: functional programming in ruby
|