funkr 0.0.9 → 0.0.10
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/funkr/adt/adt.rb +3 -0
- data/lib/funkr/extensions.rb +1 -0
- data/lib/funkr/extensions/array.rb +0 -60
- data/lib/funkr/extensions/enumerable.rb +79 -0
- data/lib/funkr/version.rb +1 -1
- data/test/tests.rb +9 -3
- metadata +5 -4
data/lib/funkr/adt/adt.rb
CHANGED
data/lib/funkr/extensions.rb
CHANGED
|
@@ -59,64 +59,4 @@ class Array
|
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
# other extensions
|
|
63
|
-
class NoHead; end
|
|
64
|
-
|
|
65
|
-
def head; empty? ? NoHead : first; end
|
|
66
|
-
|
|
67
|
-
def tail; size > 1 ? self[1..-1] : []; end
|
|
68
|
-
|
|
69
|
-
def all_different?
|
|
70
|
-
return true if tail.empty?
|
|
71
|
-
!tail.include?(head) and tail.all_different?
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/Data-List.html#group
|
|
75
|
-
def group_seq_by(&block)
|
|
76
|
-
if empty? then []
|
|
77
|
-
else
|
|
78
|
-
a,b = tail.span{|x| (yield head) == (yield x)}
|
|
79
|
-
[a.unshift(head)] + b.group_seq_by(&block)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/GHC-List.html#span
|
|
84
|
-
def span(&block)
|
|
85
|
-
if empty? then [[],[]]
|
|
86
|
-
elsif (yield head) then
|
|
87
|
-
a,b = tail.span(&block)
|
|
88
|
-
[a.unshift(head),b]
|
|
89
|
-
else [[], self]
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# Constitue des groupes disjoints de n éléments au plus
|
|
94
|
-
def groups_of(n)
|
|
95
|
-
return [] if self.empty?
|
|
96
|
-
[self.take(n)] + self.drop(n).groups_of(n)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# constitue des groupes de n éléments exactement, décalés de 1
|
|
100
|
-
def sliding_groups_of(n)
|
|
101
|
-
return [] if self.size < n
|
|
102
|
-
[ self.take(n) ] + self.tail.sliding_groups_of(n)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# trouve l'index d'une séquence
|
|
106
|
-
def seq_index(seq)
|
|
107
|
-
self.sliding_groups_of(seq.size).index(seq)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# difference entre 2 tableaux, retourne le triplet [ [missing] , [intersection], [added] ]
|
|
111
|
-
# codé en impératif parce que inject est trop lent :(
|
|
112
|
-
def diff_with(other, &block)
|
|
113
|
-
m, i, a = [], [], []
|
|
114
|
-
self.each do |e|
|
|
115
|
-
if other.find{|x| yield(e,x)} then i.push(e) # intersection
|
|
116
|
-
else m.push(e) end # missing
|
|
117
|
-
end
|
|
118
|
-
other.each { |e| a.push(e) unless self.find{|x| yield(e,x)} } # added
|
|
119
|
-
[ m, i, a ]
|
|
120
|
-
end
|
|
121
|
-
|
|
122
62
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Enumerable
|
|
2
|
+
|
|
3
|
+
# enumerable extensions
|
|
4
|
+
class NoHead; end
|
|
5
|
+
|
|
6
|
+
def head; empty? ? NoHead : first; end
|
|
7
|
+
|
|
8
|
+
def tail; self.drop(1); end
|
|
9
|
+
|
|
10
|
+
def all_different?
|
|
11
|
+
return true if tail.empty?
|
|
12
|
+
!tail.include?(head) and tail.all_different?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/Data-List.html#group
|
|
16
|
+
def group_seq_by(&block)
|
|
17
|
+
if empty? then []
|
|
18
|
+
else
|
|
19
|
+
res = []
|
|
20
|
+
rst = self
|
|
21
|
+
while rst.any? do
|
|
22
|
+
v = yield(rst.head)
|
|
23
|
+
a,rst = rst.span{|x| (yield x) == v}
|
|
24
|
+
res.push(a)
|
|
25
|
+
end
|
|
26
|
+
return res
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/GHC-List.html#span
|
|
31
|
+
def span(&block)
|
|
32
|
+
inc = []
|
|
33
|
+
self.each_with_index do |e,i|
|
|
34
|
+
if yield(e) then inc.push(e)
|
|
35
|
+
else return [ inc, self.drop(i) ] end
|
|
36
|
+
end
|
|
37
|
+
return [ inc, [] ]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Constitue des groupes disjoints de n éléments au plus
|
|
41
|
+
def groups_of(n)
|
|
42
|
+
return [] if self.empty?
|
|
43
|
+
[self.take(n)] + self.drop(n).groups_of(n)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# constitue des groupes de n éléments exactement, décalés de 1
|
|
47
|
+
def sliding_groups_of(n)
|
|
48
|
+
return [] if self.size < n
|
|
49
|
+
[ self.take(n) ] + self.tail.sliding_groups_of(n)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# trouve l'index d'une séquence
|
|
53
|
+
def seq_index(seq)
|
|
54
|
+
self.sliding_groups_of(seq.size).index(seq)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def uniq_by(&block)
|
|
58
|
+
result = []
|
|
59
|
+
self.each do |e|
|
|
60
|
+
unless result.any?{|x| yield(x,e)} then result.push(e) end
|
|
61
|
+
end
|
|
62
|
+
return result
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# difference entre 2 tableaux, retourne le triplet [ [missing] , [intersection], [added] ]
|
|
66
|
+
# codé en impératif parce que inject est trop lent :(
|
|
67
|
+
def diff_with(other, &block)
|
|
68
|
+
m, i, a = [], [], []
|
|
69
|
+
u_s = self.uniq_by(&block)
|
|
70
|
+
u_o = other.uniq_by(&block)
|
|
71
|
+
u_s.each do |e|
|
|
72
|
+
if u_o.find{|x| yield(e,x)} then i.push(e) # intersection
|
|
73
|
+
else m.push(e) end # missing
|
|
74
|
+
end
|
|
75
|
+
u_o.each { |e| a.push(e) unless u_s.find{|x| yield(e,x)} } # added
|
|
76
|
+
return [ m, i, a ]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
data/lib/funkr/version.rb
CHANGED
data/test/tests.rb
CHANGED
|
@@ -74,10 +74,12 @@ puts(a.bind do |x|
|
|
|
74
74
|
end.inspect)
|
|
75
75
|
|
|
76
76
|
|
|
77
|
+
puts "\n> span"
|
|
78
|
+
puts([1,2,4,5,7,5,8,2,10].span{|x| x < 5}.inspect)
|
|
79
|
+
|
|
77
80
|
puts "\n> group_seq_by"
|
|
78
81
|
puts([1,2,4,5,7,5,8,2,10].group_seq_by{|x| x % 2}.inspect)
|
|
79
82
|
|
|
80
|
-
|
|
81
83
|
puts "\n> groups_of"
|
|
82
84
|
puts([1,2,4,5,7,5,8,2,10].groups_of(4).inspect)
|
|
83
85
|
|
|
@@ -88,6 +90,10 @@ puts "\n> seq_index (30)"
|
|
|
88
90
|
puts((0..100).to_a.seq_index([30,31,32]))
|
|
89
91
|
|
|
90
92
|
puts "\n> diff_with"
|
|
91
|
-
a = [ {:v => 1}, {:v => 2}, {:v => 3} ]
|
|
92
|
-
b = [ {:v => 2}, {:v => 3}, {:v => 4} ]
|
|
93
|
+
a = [ {:v => 1}, {:v => 2}, {:v => 3}, {:v => 2}, {:v => 3} ]
|
|
94
|
+
b = [ {:v => 2}, {:v => 3}, {:v => 4}, {:v => 3}, {:v => 4} ]
|
|
93
95
|
puts(a.diff_with(b){|x,y| x[:v] == y[:v]}.inspect)
|
|
96
|
+
|
|
97
|
+
puts "\n> uniq_by"
|
|
98
|
+
a = [ {:v => 1}, {:v => 2}, {:v => 3}, {:v => 2}, {:v => 3}, {:v => 1} ]
|
|
99
|
+
puts(a.uniq_by{|x,y| x[:v] == y[:v]}.inspect)
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: funkr
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 11
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 0
|
|
9
|
-
-
|
|
10
|
-
version: 0.0.
|
|
9
|
+
- 10
|
|
10
|
+
version: 0.0.10
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Paul Rivier
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2011-03-
|
|
18
|
+
date: 2011-03-24 00:00:00 +01:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies: []
|
|
21
21
|
|
|
@@ -45,6 +45,7 @@ files:
|
|
|
45
45
|
- lib/funkr/compat/1.8.rb
|
|
46
46
|
- lib/funkr/extensions.rb
|
|
47
47
|
- lib/funkr/extensions/array.rb
|
|
48
|
+
- lib/funkr/extensions/enumerable.rb
|
|
48
49
|
- lib/funkr/extensions/fixnum.rb
|
|
49
50
|
- lib/funkr/types.rb
|
|
50
51
|
- lib/funkr/types/failable.rb
|