enumerable_lz 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog ADDED
@@ -0,0 +1,4 @@
1
+ == 0.1.0 / 2011-01-23
2
+
3
+ * 1st release
4
+
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2011 GOTOH Shunsuke (@antimon2)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # enumerable_lz
2
+
3
+ 'enumerable_lz' provides filter and transformation methods in `Enumerable` module.
4
+ Also it provides lazy equivalents of some methods in `Enumerable`.
5
+
6
+
7
+ ## Fundamental Usage
8
+
9
+ When require 'enumerable_lz', these lazy methods are provided:
10
+
11
+ * `Enumerable#filter`
12
+ * `Enumerable#filter_with_initproc`
13
+ * `Enumerable#transform`
14
+
15
+ For example (in Ruby 1.9.x):
16
+
17
+ require 'enumerable_lz'
18
+ require 'prime'
19
+
20
+ (1..Float::INFINITY).transform{|n|n**2+1}.filter{|m|m.prime?}.take(100)
21
+ # => [2, 5, ... , 682277, 739601] for a few msec.
22
+
23
+
24
+ ## Expanded Usage
25
+
26
+ When require 'enumerable_lz/enumerable_ex', some lazy methods equivalents to original `Enumerable` method with suffix '_lz' are provided:
27
+
28
+ * `Enumerable#select_lz`
29
+ * `Enumerable#find_all_lz`
30
+ * `Enumerable#reject_lz`
31
+ * `Enumerable#grep_lz`
32
+ * `Enumerable#map_lz`
33
+ * `Enumerable#collect_lz`
34
+ * `Enumerable#drop_lz`
35
+ * `Enumerable#drop_while_lz`
36
+ * `Enumerable#take_lz`
37
+ * `Enumerable#take_while_lz`
38
+
39
+
40
+ For example (in Ruby 1.9.x):
41
+
42
+ require 'enumerable_lz'
43
+ require 'enumerable_lz/enumerable_ex'
44
+ require 'prime'
45
+
46
+ (1..Float::INFINITY).map_lz{|n|n**2+1}.select_lz{|m|m.prime?}.take_lz(100).to_a
47
+ # => [2, 5, ... , 682277, 739601] for a few msec.
48
+
49
+ These expanded methods are inplemented with fundamental filter and transformation methods.
50
+
51
+
52
+ ## Supported Rubies
53
+
54
+ * Ruby 1.9.x (testing 1.9.2-p0, 1.9.2 p-136)
55
+ * Ruby 1.8.7 (testing 1.8.7-p330)
56
+ * JRuby 1.5.x (testing 1.5.6)
57
+ * MacRuby 0.8
58
+
59
+ ## Installation
60
+
61
+ gem install enumerable_lz
62
+
63
+ or
64
+
65
+ gem install antimon2-enumerable_lz
66
+
67
+
68
+ ## License
69
+
70
+ The MIT License
71
+ Copyright (c) 2011 GOTOH Shunsuke (@antimon2)
72
+
73
+ Please see [LICENSE.txt](LICENSE.txt) for details.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require 'rake/testtask'
2
+
3
+ task :default => [:test]
4
+
5
+ Rake::TestTask.new
@@ -0,0 +1,18 @@
1
+ if RUBY_VERSION > "1.8.7"
2
+ if RUBY_DESCRIPTION !~ /^macruby/i
3
+ require File.dirname(__FILE__)+'/enumerable_lz/filter'
4
+ require File.dirname(__FILE__)+'/enumerable_lz/transform'
5
+ else
6
+ require File.dirname(__FILE__)+'/enumerable_lz/filter_mrb'
7
+ require File.dirname(__FILE__)+'/enumerable_lz/transform_mrb'
8
+ end
9
+ else
10
+ require File.dirname(__FILE__)+'/enumerable_lz/filter_18'
11
+ require File.dirname(__FILE__)+'/enumerable_lz/transform_18'
12
+ end
13
+
14
+ module Enumerable
15
+ module EnumerableLz
16
+ VERSION = "0.1.0"
17
+ end
18
+ end
@@ -0,0 +1,55 @@
1
+ require File.expand_path('..', __FILE__)
2
+
3
+ module Enumerable
4
+ def select_lz &block
5
+ filter &block
6
+ end
7
+
8
+ alias :find_all_lz :select_lz
9
+
10
+ def reject_lz &block
11
+ filter {|e|!block.call(e)}
12
+ end
13
+
14
+ def grep_lz pattern, &block
15
+ enum = filter pattern
16
+ block_given? ? enum.transform(&block) : enum
17
+ end
18
+
19
+ alias :map_lz :transform
20
+ alias :collect_lz :map_lz
21
+
22
+ def drop_lz n
23
+ raise ArgumentError, "attempt to take negative size" if n < 0
24
+ # each_with_index.filter{|el,idx|idx >= n}.transform{|el,idx|el}
25
+ cnt = 0
26
+ filter_with_initproc(Proc.new{cnt=0}) {|el| (cnt+=1) > n}
27
+ end
28
+
29
+ def drop_while_lz &block
30
+ return self if !block_given?
31
+ flg = false
32
+ filter_with_initproc(Proc.new{flg=false}) {|el|flg || (!block.call(el) ? flg = true : false)}
33
+ end
34
+
35
+ def take_lz n
36
+ raise ArgumentError, "attempt to take negative size" if n < 0
37
+ # each_with_index.filter{|el,idx|throw :do_break if idx >= n;true}.transform{|el,idx|el}
38
+ cnt = 0
39
+ filter_with_initproc(Proc.new{cnt=0}) {|el| throw :do_break if (cnt+=1) > n;true}
40
+ end
41
+
42
+ def take_while_lz &block
43
+ return self if !block_given?
44
+ filter {|el|throw :do_break unless block.call(el);true}
45
+ end
46
+
47
+ # def zip_lz *lists
48
+ # enums = lists.map{|list|list.each rescue [].each}
49
+ # Enumerator.new do |y|
50
+ # self.each do |el|
51
+ # y << enums.each_with_object([el]){|enum, a|a << (enum.next rescue nil)}
52
+ # end
53
+ # end
54
+ # end
55
+ end
@@ -0,0 +1,67 @@
1
+ # for Ruby1.9.x except for MacRuby
2
+ module Enumerable
3
+ def filter pattern = nil, &block
4
+ Filter.new self, pattern||block
5
+ end
6
+
7
+ def filter_with_initproc init_proc, pattern = nil, &block
8
+ Filter.new self, init_proc, pattern||block
9
+ end
10
+
11
+ class Filter < Enumerator
12
+ def initialize obj, *args
13
+ the_filter = args.shift
14
+ init_block, the_filter = [the_filter, args.shift] unless args.empty?
15
+ @org_enum = obj
16
+ @init_block = init_block unless init_block.nil?
17
+ super() do |y|
18
+ @init_block.call unless @init_block.nil?
19
+ catch :do_break do
20
+ @org_enum.each do |*el|
21
+ y.yield *el if matches_filter? *el
22
+ end
23
+ end
24
+ end
25
+ filter! the_filter if the_filter
26
+ end
27
+
28
+ def filter! pattern=nil, &block
29
+ @filter||=[]
30
+ if pattern.is_a? Array
31
+ @filter.push(*pattern)
32
+ else
33
+ @filter<<(pattern || block)
34
+ end
35
+ self
36
+ end
37
+
38
+ #[override]
39
+ def filter pattern=nil, &block
40
+ return super unless @init_block.nil?
41
+ # clone.filter! pattern, &block
42
+ patterns = @filter.nil? ? [] : @filter.clone
43
+ if pattern.is_a? Array
44
+ patterns.push(*pattern)
45
+ else
46
+ patterns<<(pattern || block)
47
+ end
48
+ Filter.new @org_enum, patterns
49
+ end
50
+
51
+ private
52
+ def matches_filter? obj, *others
53
+ return true if @filter.nil?
54
+ args = [obj, *others]
55
+ @filter.all? do |filter|
56
+ case filter
57
+ when nil
58
+ true
59
+ when Proc
60
+ filter[*args]
61
+ else
62
+ filter===obj
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,71 @@
1
+ # for Ruby1.8.7
2
+ module Enumerable
3
+ def filter pattern = nil, &block
4
+ Filter.new self, pattern||block
5
+ end
6
+
7
+ def filter_with_initproc init_proc, pattern = nil, &block
8
+ Filter.new self, init_proc, pattern||block
9
+ end
10
+
11
+ class Filter < Enumerator
12
+ require 'generator'
13
+ def initialize obj, *args
14
+ the_filter = args.shift
15
+ init_block, the_filter = [the_filter, args.shift] unless args.empty?
16
+ filter! the_filter if the_filter
17
+ @org_enum = obj
18
+ @init_block = init_block unless init_block.nil?
19
+ end
20
+
21
+ def each &block
22
+ return self unless block_given?
23
+ catch :do_break do
24
+ @init_block.call unless @init_block.nil?
25
+ @org_enum.each do |*el|
26
+ block.call(*el) if matches_filter? *el
27
+ end
28
+ end
29
+ self
30
+ end
31
+
32
+ def filter! pattern=nil, &block
33
+ @filter||=[]
34
+ if pattern.is_a? Array
35
+ @filter.push(*pattern)
36
+ else
37
+ @filter<<(pattern || block)
38
+ end
39
+ self
40
+ end
41
+
42
+ #[override]
43
+ def filter pattern=nil, &block
44
+ return super unless @init_block.nil?
45
+ # clone.filter! pattern, &block
46
+ patterns = @filter.nil? ? [] : @filter.clone
47
+ if pattern.is_a? Array
48
+ patterns.push(*pattern)
49
+ else
50
+ patterns << (pattern || block)
51
+ end
52
+ Filter.new @org_enum, patterns
53
+ end
54
+
55
+ private
56
+ def matches_filter? obj, *others
57
+ return true if @filter.nil?
58
+ args = [obj, *others]
59
+ @filter.all? do |filter|
60
+ case filter
61
+ when nil
62
+ true
63
+ when Proc
64
+ filter[*args]
65
+ else
66
+ filter===obj
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,72 @@
1
+ # for MacRuby
2
+ module Enumerable
3
+ def filter pattern = nil, &block
4
+ Filter.new self, pattern||block
5
+ end
6
+
7
+ def filter_with_initproc init_proc, pattern = nil, &block
8
+ Filter.new self, init_proc, pattern||block
9
+ end
10
+
11
+ class Filter < Enumerator
12
+ def initialize obj, *args
13
+ the_filter = args.shift
14
+ init_block, the_filter = [the_filter, args.shift] unless args.empty?
15
+ @org_enum = obj
16
+ @init_block = init_block unless init_block.nil?
17
+ outer = self
18
+ super Class.new {
19
+ define_method :each do
20
+ return outer unless block_given?
21
+ init_block.call unless init_block.nil?
22
+ catch :do_break do
23
+ obj.each do |*el|
24
+ yield *el if outer.__send__(:matches_filter?, *el)
25
+ end
26
+ end
27
+ outer
28
+ end
29
+ }.new
30
+ filter! the_filter if the_filter
31
+ end
32
+
33
+ def filter! pattern=nil, &block
34
+ @filter||=[]
35
+ if pattern.is_a? Array
36
+ @filter.push(*pattern)
37
+ else
38
+ @filter<<(pattern || block)
39
+ end
40
+ self
41
+ end
42
+
43
+ #[override]
44
+ def filter pattern=nil, &block
45
+ # clone.filter! pattern, &block
46
+ patterns = @filter.nil? ? [] : @filter.clone
47
+ if pattern.is_a? Array
48
+ patterns.push(*pattern)
49
+ else
50
+ patterns<<(pattern || block)
51
+ end
52
+ return Filter.new @org_enum, @init_block, patterns unless @init_block.nil?
53
+ Filter.new @org_enum, patterns
54
+ end
55
+
56
+ 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
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,49 @@
1
+ # for Ruby1.9.x except for MacRuby
2
+ module Enumerable
3
+ def transform &block
4
+ Transform.new self, &block
5
+ end
6
+
7
+ class Transform < Enumerator
8
+ def initialize obj, &transformer
9
+ @org_enum = obj
10
+ super() do |y|
11
+ obj.each do |*el|
12
+ y << apply_transform(*el)
13
+ end
14
+ end
15
+ transform! &transformer if block_given?
16
+ end
17
+
18
+ def transform! &block
19
+ @transformer||=[]
20
+ @transformer << block if block_given?
21
+ self
22
+ end
23
+
24
+ #[override]
25
+ def transform &block
26
+ # clone.transform! &block
27
+ cp = Transform.new @org_enum
28
+ @transformer.each do |org_block|
29
+ cp.transform! &org_block
30
+ end unless @transformer.nil?
31
+ cp.transform! &block
32
+ end
33
+
34
+ # def clone
35
+ # cp = super
36
+ # cp.instance_eval { @transformer = @transformer.nil? ? [] : @transformer.clone }
37
+ # cp
38
+ # end
39
+
40
+ 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
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,46 @@
1
+ # for Ruby1.8.7
2
+ module Enumerable
3
+ def transform &block
4
+ Transform.new self, &block
5
+ end
6
+
7
+ class Transform < Enumerator
8
+ def initialize obj, &transformer
9
+ @org_enum = obj
10
+ transform! &transformer if block_given?
11
+ end
12
+
13
+ def each &block
14
+ return self unless block_given?
15
+ @org_enum.each do |*el|
16
+ block.call apply_transform(*el)
17
+ end
18
+ self
19
+ end
20
+
21
+ def transform! &block
22
+ @transformer||=[]
23
+ @transformer << block if block_given?
24
+ self
25
+ end
26
+
27
+ #[override]
28
+ def transform &block
29
+ # clone.transform! &block
30
+ cp = Transform.new @org_enum
31
+ @transformer.each do |org_block|
32
+ cp.transform! &org_block
33
+ end unless @transformer.nil?
34
+ cp.transform! &block
35
+ end
36
+
37
+ 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
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,47 @@
1
+ # for MacRuby
2
+ module Enumerable
3
+ def transform &block
4
+ Transform.new self, &block
5
+ end
6
+
7
+ class Transform < Enumerator
8
+ def initialize obj, &transformer
9
+ @org_enum = obj
10
+ outer = self
11
+ super Class.new {
12
+ define_method :each do
13
+ return outer unless block_given?
14
+ obj.each do |*el|
15
+ yield outer.__send__(:apply_transform, *el)
16
+ end
17
+ end
18
+ }.new
19
+ transform! &transformer if block_given?
20
+ end
21
+
22
+ def transform! &block
23
+ @transformer||=[]
24
+ @transformer << block if block_given?
25
+ self
26
+ end
27
+
28
+ #[override]
29
+ def transform &block
30
+ # clone.transform! &block
31
+ cp = Transform.new @org_enum
32
+ @transformer.each do |org_block|
33
+ cp.transform! &org_block
34
+ end unless @transformer.nil?
35
+ cp.transform! &block
36
+ end
37
+
38
+ 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
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,84 @@
1
+ require 'test/unit'
2
+ require 'enumerable_lz'
3
+ require 'enumerable_lz/enumerable_ex'
4
+
5
+ class EnumerableExTest < Test::Unit::TestCase
6
+ def test_basic
7
+ cnt=0
8
+ (1..1000000).map_lz{|n|(cnt=n)**2}.take_while{|n|n<10000}
9
+ assert(cnt<1000000)
10
+ # cnt=0
11
+ # (0..1000000).map{|n|(cnt=n)**2}.take_while{|n|n<10000}
12
+ # assert_equal(1000001, cnt)
13
+ end
14
+
15
+ def setup
16
+ @arr_str = %w[Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum]
17
+ end
18
+
19
+ def test_select_lz
20
+ enum = @arr_str.select_lz{|letters|letters.size==5}
21
+ assert_kind_of(Enumerable, enum)
22
+ assert_equal(@arr_str.select{|letters|letters.size==5}, enum.to_a)
23
+ end
24
+
25
+ def test_find_all_lz
26
+ enum = @arr_str.find_all_lz{|letters|letters.size==4}
27
+ assert_kind_of(Enumerable, enum)
28
+ assert_equal(@arr_str.find_all{|letters|letters.size==4}, enum.to_a)
29
+ end
30
+
31
+ def test_reject_lz
32
+ enum = @arr_str.reject_lz{|letters|letters.size>5}
33
+ assert_kind_of(Enumerable, enum)
34
+ assert_equal(@arr_str.reject{|letters|letters.size>5}, enum.to_a)
35
+ end
36
+
37
+ def test_grep_lz
38
+ enum = @arr_str.grep_lz(/^[A-Z]/)
39
+ assert_kind_of(Enumerable, enum)
40
+ assert_equal(@arr_str.grep(/^[A-Z]/), enum.to_a)
41
+ end
42
+
43
+ def test_grep_lz_block
44
+ enum = @arr_str.grep_lz(/^[A-Z]/){|c|c.swapcase}
45
+ assert_kind_of(Enumerable, enum)
46
+ assert_equal(@arr_str.grep(/^[A-Z]/){|c|c.swapcase}, enum.to_a)
47
+ end
48
+
49
+ def test_map_lz
50
+ enum = @arr_str.map_lz{|c|c.swapcase}
51
+ assert_kind_of(Enumerable, enum)
52
+ assert_equal(@arr_str.map{|c|c.swapcase}, enum.to_a)
53
+ end
54
+
55
+ def test_collect_lz
56
+ enum = @arr_str.collect_lz{|c|c.downcase}
57
+ assert_kind_of(Enumerable, enum)
58
+ assert_equal(@arr_str.collect{|c|c.downcase}, enum.to_a)
59
+ end
60
+
61
+ def test_drop_lz
62
+ enum = @arr_str.drop_lz(10)
63
+ assert_kind_of(Enumerable, enum)
64
+ assert_equal(@arr_str.drop(10), enum.to_a)
65
+ end
66
+
67
+ def test_drop_while_lz
68
+ enum = @arr_str.drop_while_lz{|letters|letters.size < 6}
69
+ assert_kind_of(Enumerable, enum)
70
+ assert_equal(@arr_str.drop_while{|letters|letters.size < 6}, enum.to_a)
71
+ end
72
+
73
+ def test_take_lz
74
+ enum = @arr_str.take_lz(10)
75
+ assert_kind_of(Enumerable, enum)
76
+ assert_equal(@arr_str.take(10), enum.to_a)
77
+ end
78
+
79
+ def test_take_while_lz
80
+ enum = @arr_str.take_while_lz{|letters|letters.size < 6}
81
+ assert_kind_of(Enumerable, enum)
82
+ assert_equal(@arr_str.take_while{|letters|letters.size < 6}, enum.to_a)
83
+ end
84
+ end
@@ -0,0 +1,125 @@
1
+ require 'test/unit'
2
+ require 'enumerable_lz'
3
+
4
+ class FilterTest < Test::Unit::TestCase
5
+ def test_instance
6
+ enum = Enumerable::Filter.new []
7
+ assert_not_nil(enum)
8
+ assert_kind_of(Enumerable, enum)
9
+ end
10
+
11
+ def test_filter_array
12
+ array = %w[Yes I have a number]
13
+ enum = array.filter{|letters|letters.size > 1}
14
+ assert_instance_of(Enumerable::Filter, enum)
15
+ assert_equal(%w[Yes have number], enum.to_a)
16
+ end
17
+
18
+ def test_pattern_filtering_1
19
+ range = "a"..."aaa"
20
+ enum = range.filter(/[aeiou]{2}/)
21
+ assert_equal(%w[aa ae ai ao au ea ee ei eo eu ia ie ii io iu oa oe oi oo ou ua ue ui uo uu], enum.to_a)
22
+ end
23
+
24
+ def test_pattern_filtering_2_1
25
+ array = [123, "abc", Math::PI, %q[q], nil]
26
+ enum1 = array.filter(String)
27
+ assert_equal(["abc", "q"], enum1.to_a)
28
+ end
29
+
30
+ def test_pattern_filtering_2_2
31
+ array = [123, "abc", Math::PI, %q[q], nil]
32
+ enum2 = array.filter(Numeric)
33
+ assert_equal([123, Math::PI], enum2.to_a)
34
+ end
35
+
36
+ def test_pattern_filtering_2_3
37
+ array = [123, "abc", Math::PI, %q[q], nil]
38
+ enum3 = array.filter(1..100)
39
+ assert_equal([Math::PI], enum3.to_a)
40
+ end
41
+
42
+ def test_multi_filter_1
43
+ range = -10..10
44
+ pr1 = lambda{|n|n>2}
45
+ pr2 = lambda{|n|n**2<10}
46
+ enum1 = range.filter(&pr1).filter(&pr2)
47
+ assert_equal([3], enum1.to_a)
48
+ end
49
+
50
+ def test_multi_filter_2
51
+ range = -10..10
52
+ pr1 = lambda{|n|n>2}
53
+ pr2 = lambda{|n|n**2<10}
54
+ enum2 = range.filter(&pr2).filter(&pr1)
55
+ assert_equal([3], enum2.to_a)
56
+ end
57
+
58
+ def test_multi_filter_3
59
+ range = -10..10
60
+ pr1 = lambda{|n|n>2}
61
+ pr2 = lambda{|n|n**2<10}
62
+ enum2 = range.filter([pr1, pr2])
63
+ assert_equal([3], enum2.to_a)
64
+ end
65
+
66
+ def test_multi_filter_4
67
+ range = -10..10
68
+ pr1 = lambda{|n|n>2}
69
+ pr2 = lambda{|n|n**2<10}
70
+ enum1 = range.filter(&pr1)
71
+ arr1 = enum1.to_a
72
+ enum2 = enum1.filter(&pr2)
73
+ assert_equal(arr1, enum1.to_a)
74
+ end
75
+
76
+ def test_filter_not_same
77
+ enum1 = [].filter
78
+ enum2 = enum1.filter
79
+ assert_not_same(enum1, enum2)
80
+ end
81
+
82
+ def test_filter!
83
+ enum1 = [].filter
84
+ enum2 = enum1.filter!
85
+ assert_same(enum1, enum2)
86
+ end
87
+
88
+ def test_init_block
89
+ range = -10..10
90
+ cnt = 0
91
+ init_pr = Proc.new{cnt = 0}
92
+ filter_pr = Proc.new{(cnt+=1)<=10}
93
+ enum = Enumerable::Filter.new range, init_pr, filter_pr
94
+ assert_equal([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], enum.to_a)
95
+ end
96
+
97
+ def test_filter_with_initproc_1
98
+ range = -10..10
99
+ cnt = 0
100
+ init_pr = Proc.new{cnt = 0}
101
+ filter_pr = Proc.new{(cnt+=1)<=10}
102
+ enum = range.filter_with_initproc init_pr, &filter_pr
103
+ assert_equal([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], enum.to_a)
104
+ # v-- same result when execute twice or more
105
+ assert_equal([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1], enum.to_a)
106
+ end
107
+
108
+ def test_filter_with_initproc_2
109
+ range = 1..20
110
+ sum = 100
111
+ init_pr = Proc.new{sum = 0}
112
+ enum1 = range.filter_with_initproc(init_pr) {|n|(sum+=n)>100}
113
+ enum2 = enum1.filter(&:odd?)
114
+ # assert_not_equal([1, 3, 5, 7, 9, 11, 13, 15, 17, 19], enum2.to_a)
115
+ assert_equal([15, 17, 19], enum2.to_a)
116
+ end
117
+
118
+ def test_filter_with_throw_do_break
119
+ range = 1..20
120
+ sum = 0
121
+ init_pr = Proc.new{sum = 0}
122
+ enum = range.filter_with_initproc(init_pr) {|n|throw :do_break if (sum+=n)>100;true}
123
+ assert_equal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], enum.to_a)
124
+ end
125
+ end
@@ -0,0 +1,55 @@
1
+ require 'test/unit'
2
+ require 'enumerable_lz'
3
+
4
+ class TransformTest < Test::Unit::TestCase
5
+ def test_instance
6
+ enum = Enumerable::Transform.new []
7
+ assert_not_nil(enum)
8
+ assert_kind_of(Enumerable, enum)
9
+ end
10
+
11
+ def test_transform_array
12
+ array = %w[Yes I have a number]
13
+ enum = array.transform{|letters|letters.swapcase}
14
+ assert_instance_of(Enumerable::Transform, enum)
15
+ assert_equal(%w[yES i HAVE A NUMBER], enum.to_a)
16
+ end
17
+
18
+ def test_multi_transform_1
19
+ range = -10..10
20
+ pr1 = lambda{|n|n**2}
21
+ pr2 = lambda{|n|10-n}
22
+ enum1 = range.transform(&pr1).transform(&pr2)
23
+ assert_equal(range.map{|n|10-n**2}, enum1.to_a)
24
+ end
25
+
26
+ def test_multi_transform_2
27
+ range = -10..10
28
+ pr1 = lambda{|n|n**2}
29
+ pr2 = lambda{|n|10-n}
30
+ enum2 = range.transform(&pr2).transform(&pr1)
31
+ assert_equal(range.map{|n|(10-n)**2}, enum2.to_a)
32
+ end
33
+
34
+ def test_multi_transform_3
35
+ range = -10..10
36
+ pr1 = lambda{|n|n**2}
37
+ pr2 = lambda{|n|10-n}
38
+ enum1 = range.transform(&pr1)
39
+ arr1 = enum1.to_a
40
+ enum1.transform(&pr2)
41
+ assert_equal(arr1, enum1.to_a)
42
+ end
43
+
44
+ def test_transform_not_same
45
+ enum1 = [].transform
46
+ enum2 = enum1.transform
47
+ assert_not_same(enum1, enum2)
48
+ end
49
+
50
+ def test_transform!
51
+ enum1 = [].transform
52
+ enum2 = enum1.transform!
53
+ assert_same(enum1, enum2)
54
+ end
55
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enumerable_lz
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - antimon2
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-23 00:00:00 +09:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Add Enumerable#filter, Enumerable#transform and some equivalent methods on Enumerable with suffix '_lz'.
22
+ email: antimon2.me@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - README.md
31
+ - LICENSE.txt
32
+ - ChangeLog
33
+ - Rakefile
34
+ - test/test_enumerable_ex.rb
35
+ - test/test_filter.rb
36
+ - test/test_transform.rb
37
+ - lib/enumerable_lz/enumerable_ex.rb
38
+ - lib/enumerable_lz/filter.rb
39
+ - lib/enumerable_lz/filter_18.rb
40
+ - lib/enumerable_lz/filter_mrb.rb
41
+ - lib/enumerable_lz/transform.rb
42
+ - lib/enumerable_lz/transform_18.rb
43
+ - lib/enumerable_lz/transform_mrb.rb
44
+ - lib/enumerable_lz.rb
45
+ has_rdoc: true
46
+ homepage: https://github.com/antimon2/enumerable_lz
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ segments:
60
+ - 1
61
+ - 8
62
+ - 7
63
+ version: 1.8.7
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project: enumerable_lz
75
+ rubygems_version: 1.3.7
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Add Enumerable#filter, Enumerable#transform and some equivalent methods on Enumerable with suffix '_lz'.
79
+ test_files:
80
+ - test/test_enumerable_ex.rb
81
+ - test/test_filter.rb
82
+ - test/test_transform.rb