enumerable_lz 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +73 -0
- data/Rakefile +5 -0
- data/lib/enumerable_lz.rb +18 -0
- data/lib/enumerable_lz/enumerable_ex.rb +55 -0
- data/lib/enumerable_lz/filter.rb +67 -0
- data/lib/enumerable_lz/filter_18.rb +71 -0
- data/lib/enumerable_lz/filter_mrb.rb +72 -0
- data/lib/enumerable_lz/transform.rb +49 -0
- data/lib/enumerable_lz/transform_18.rb +46 -0
- data/lib/enumerable_lz/transform_mrb.rb +47 -0
- data/test/test_enumerable_ex.rb +84 -0
- data/test/test_filter.rb +125 -0
- data/test/test_transform.rb +55 -0
- metadata +82 -0
data/ChangeLog
ADDED
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,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
|
data/test/test_filter.rb
ADDED
@@ -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
|