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.
@@ -44,6 +44,9 @@ module Funkr
44
44
  define_singleton_method(c) do |*data|
45
45
  self.new(c,*data)
46
46
  end
47
+ define_method(format("%s?",c).to_sym) do
48
+ const() == c
49
+ end
47
50
  end
48
51
  end
49
52
 
@@ -1,2 +1,3 @@
1
1
  require 'funkr/extensions/fixnum'
2
2
  require 'funkr/extensions/array'
3
+ require 'funkr/extensions/enumerable'
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Funkr
2
- VERSION = "0.0.9"
2
+ VERSION = "0.0.10"
3
3
  end
@@ -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: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 9
10
- version: 0.0.9
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-21 00:00:00 +01:00
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