enumerable_lz 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -6,3 +6,7 @@
6
6
 
7
7
  * Improve performance (except for MacRuby)
8
8
 
9
+ == 0.1.2 / 2011-05-01
10
+
11
+ * Improve performance more
12
+
@@ -16,15 +16,13 @@ module Enumerable
16
16
  @init_block = init_block unless init_block.nil?
17
17
  super() do |y|
18
18
  @init_block.call unless @init_block.nil?
19
- the_enum = (@filter||[]).inject(@org_enum) do |r,f|
20
- Enumerator.new do |iy|
21
- r.each do |el|
22
- iy.yield el if f.call(el)
23
- end
24
- end
19
+ compiled_filter = (@filter||[Proc.new{true}]).inject do |r,f|
20
+ Proc.new{|el| r===el && f===el}
25
21
  end
26
22
  catch :do_break do
27
- the_enum.each {|el| y.yield el}
23
+ @org_enum.each do |el|
24
+ y.yield el if compiled_filter===el
25
+ end
28
26
  end
29
27
  end
30
28
  filter! the_filter if the_filter
@@ -58,11 +56,15 @@ module Enumerable
58
56
  case pattern
59
57
  when nil
60
58
  Proc.new{true}
61
- when Proc
62
- pattern
63
- else
64
- pattern.respond_to?(:to_proc) ? pattern.to_proc : Proc.new{|el|pattern===el}
59
+ else # Proc#=== is equal to Proc#call on Ruby1.9.x
60
+ pattern.respond_to?(:to_proc) ? pattern.to_proc : pattern
65
61
  end
66
62
  end
67
63
  end
64
+ end
65
+ #against the Bug on JRuby <1.6.2
66
+ if !(Proc.new{true}===true)
67
+ class Proc
68
+ alias :=== :call
69
+ end
68
70
  end
@@ -20,11 +20,13 @@ module Enumerable
20
20
  def each &block
21
21
  return self unless block_given?
22
22
  @init_block.call unless @init_block.nil?
23
- the_enum = (@filter||[]).inject(@org_enum) do |r,f|
24
- CompliedFilter.new r, f
23
+ compiled_filter = (@filter||[Proc.new{true}]).inject do |r,f|
24
+ Proc.new{|el| r[el] && f[el]}
25
25
  end
26
26
  catch :do_break do
27
- the_enum.each{|el| block.call(el)}
27
+ @org_enum.each do |el|
28
+ block.call(el) if compiled_filter[el]
29
+ end
28
30
  end
29
31
  self
30
32
  end
@@ -63,18 +65,5 @@ module Enumerable
63
65
  pattern.respond_to?(:to_proc) ? pattern.to_proc : Proc.new{|el|pattern===el}
64
66
  end
65
67
  end
66
-
67
- class CompliedFilter
68
- def initialize org_enum, filter
69
- @org_enum = org_enum
70
- @filter = filter
71
- end
72
-
73
- def each &block
74
- @org_enum.each do |el|
75
- block.call(el) if @filter.call(el)
76
- end
77
- end
78
- end
79
68
  end
80
69
  end
@@ -19,9 +19,10 @@ module Enumerable
19
19
  define_method :each do
20
20
  return outer unless block_given?
21
21
  init_block.call unless init_block.nil?
22
+ compiled_filter = outer.__send__(:compile_filter)
22
23
  catch :do_break do
23
- obj.each do |*el|
24
- yield *el if outer.__send__(:matches_filter?, *el)
24
+ obj.each do |el|
25
+ yield el if compiled_filter===el
25
26
  end
26
27
  end
27
28
  outer
@@ -33,9 +34,9 @@ module Enumerable
33
34
  def filter! pattern=nil, &block
34
35
  @filter||=[]
35
36
  if pattern.is_a? Array
36
- @filter.push(*pattern)
37
+ pattern.each{|el| @filter << conv_proc(el)}
37
38
  else
38
- @filter<<(pattern || block)
39
+ @filter<<conv_proc(pattern || block)
39
40
  end
40
41
  self
41
42
  end
@@ -54,18 +55,17 @@ module Enumerable
54
55
  end
55
56
 
56
57
  private
57
- def matches_filter? obj, *others
58
- return true if @filter.nil?
59
- args = [obj, *others]
60
- @filter.all? do |filter|
61
- case filter
62
- when nil
63
- true
64
- when Proc
65
- filter[*args]
66
- else
67
- filter===obj
68
- end
58
+ def conv_proc pattern
59
+ case pattern
60
+ when nil
61
+ Proc.new{true}
62
+ else # Proc#=== is equal to Proc#call on Ruby1.9.x
63
+ pattern.respond_to?(:to_proc) ? pattern.to_proc : pattern
64
+ end
65
+ end
66
+ def compile_filter
67
+ @filter.inject do |r,f|
68
+ Proc.new{|el| r===el && f===el}
69
69
  end
70
70
  end
71
71
  end
@@ -8,8 +8,9 @@ module Enumerable
8
8
  def initialize obj, &transformer
9
9
  @org_enum = obj
10
10
  super() do |y|
11
- obj.each do |*el|
12
- y << apply_transform(*el)
11
+ the_transformer = compile_transformer
12
+ obj.each do |el|
13
+ y << the_transformer[el]
13
14
  end
14
15
  end
15
16
  transform! &transformer if block_given?
@@ -31,19 +32,12 @@ module Enumerable
31
32
  cp.transform! &block
32
33
  end
33
34
 
34
- # def clone
35
- # cp = super
36
- # cp.instance_eval { @transformer = @transformer.nil? ? [] : @transformer.clone }
37
- # cp
38
- # end
39
-
40
35
  private
41
- def apply_transform *args
42
- result = args
43
- @transformer.each do |transformer|
44
- result = transformer[*result] unless transformer.nil?
45
- end unless @transformer.nil?
46
- result
36
+ def compile_transformer
37
+ return Proc.new{|a|a} if @transformer.nil? || @transformer.size==0
38
+ @transformer.inject do |r,f|
39
+ Proc.new{|el|f[r[el]]}
40
+ end
47
41
  end
48
42
  end
49
43
  end
@@ -12,8 +12,9 @@ module Enumerable
12
12
 
13
13
  def each &block
14
14
  return self unless block_given?
15
- @org_enum.each do |*el|
16
- block.call apply_transform(*el)
15
+ the_transformer = compile_transformer
16
+ @org_enum.each do |el|
17
+ block.call the_transformer[el]
17
18
  end
18
19
  self
19
20
  end
@@ -35,12 +36,11 @@ module Enumerable
35
36
  end
36
37
 
37
38
  private
38
- def apply_transform *args
39
- result = args
40
- @transformer.each do |transformer|
41
- result = transformer[*result] unless transformer.nil?
42
- end unless @transformer.nil?
43
- result
39
+ def compile_transformer
40
+ return Proc.new{|a|a} if @transformer.nil? || @transformer.size==0
41
+ @transformer.inject do |r,f|
42
+ Proc.new{|el|f[r[el]]}
43
+ end
44
44
  end
45
45
  end
46
46
  end
@@ -11,8 +11,9 @@ module Enumerable
11
11
  super Class.new {
12
12
  define_method :each do
13
13
  return outer unless block_given?
14
- obj.each do |*el|
15
- yield outer.__send__(:apply_transform, *el)
14
+ the_transformer = outer.__send__(:compile_transformer)
15
+ obj.each do |el|
16
+ yield the_transformer[el]
16
17
  end
17
18
  end
18
19
  }.new
@@ -36,12 +37,11 @@ module Enumerable
36
37
  end
37
38
 
38
39
  private
39
- def apply_transform *args
40
- result = args
41
- @transformer.each do |transformer|
42
- result = transformer[*result] unless transformer.nil?
43
- end unless @transformer.nil?
44
- result
40
+ def compile_transformer
41
+ return Proc.new{|a|a} if @transformer.nil? || @transformer.size==0
42
+ @transformer.inject do |r,f|
43
+ Proc.new{|el|f[r[el]]}
44
+ end
45
45
  end
46
46
  end
47
47
  end
data/lib/enumerable_lz.rb CHANGED
@@ -13,6 +13,6 @@ end
13
13
 
14
14
  module Enumerable
15
15
  module EnumerableLz
16
- VERSION = "0.1.1"
16
+ VERSION = "0.1.2"
17
17
  end
18
18
  end
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumerable_lz
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
4
+ prerelease:
5
+ version: 0.1.2
10
6
  platform: ruby
11
7
  authors:
12
8
  - antimon2
@@ -56,23 +52,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
52
  requirements:
57
53
  - - ">="
58
54
  - !ruby/object:Gem::Version
59
- segments:
60
- - 1
61
- - 8
62
- - 7
63
55
  version: 1.8.7
64
56
  required_rubygems_version: !ruby/object:Gem::Requirement
65
57
  none: false
66
58
  requirements:
67
59
  - - ">="
68
60
  - !ruby/object:Gem::Version
69
- segments:
70
- - 0
71
61
  version: "0"
72
62
  requirements: []
73
63
 
74
64
  rubyforge_project: enumerable_lz
75
- rubygems_version: 1.3.7
65
+ rubygems_version: 1.5.3
76
66
  signing_key:
77
67
  specification_version: 3
78
68
  summary: Add Enumerable#filter, Enumerable#transform and some equivalent methods on Enumerable with suffix '_lz'.