enumerabler 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +5 -0
  3. data/README.txt +65 -0
  4. data/Rakefile +11 -0
  5. data/lib/enumerabler.rb +112 -0
  6. metadata +72 -0
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2009-11-11
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
@@ -0,0 +1,5 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/enumerabler.rb
@@ -0,0 +1,65 @@
1
+ = enumerabler
2
+
3
+ * http://github.com/mame/enumerabler/tree/master
4
+
5
+ == DESCRIPTION:
6
+
7
+ enumerabler enhances Enumerable with methods returning enumerator.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ - Enumerable#grepper
12
+ - Enumerable#finder_all (alias: all_finder, selector)
13
+ - Enumerable#rejecter
14
+ - Enumerable#collector (alias: mapper)
15
+ - Enumerable#flat_mapper (alias: concat_collector)
16
+ - Enumerable#zipper
17
+ - Enumerable#taker
18
+ - Enumerable#taker_while
19
+ - Enumerable#dropper
20
+ - Enumerable#dropper_while
21
+
22
+ == SYNOPSIS:
23
+
24
+ require "enumerabler"
25
+
26
+ # `select' and `selector' have the almost same behavior.
27
+ ary.select {|x| x.even? }.take(10)
28
+ ary.selector {|x| x.even? }.take(10)
29
+ # While `select' returns an array, `selector' returns an Enumerator
30
+ # corresponding the array. So, the latter requires no intermediate
31
+ # array, which makes the latter more effective than the former.
32
+
33
+
34
+ # Sieve of Eratosthenes
35
+ def sieve(e, &blk)
36
+ yield n = e.first
37
+ sieve(e.rejecter {|x| x % n == 0 }, &blk)
38
+ end
39
+
40
+ sieve(2..(1.0/0.0)) {|x| p x } #=> 2, 3, 5, 7, 11, 13, 17, 19, 23, ...
41
+
42
+
43
+ # Fibonacci numbers
44
+ def fibonacci
45
+ Enumerator.new do |e|
46
+ e << 1
47
+ e << 1
48
+ fibonacci.zip(fibonacci.dropper(1)) {|x, y| e << x + y }
49
+ end
50
+ end
51
+
52
+ fibonacci.each {|x| p x } #=> 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
53
+
54
+ == REQUIREMENTS:
55
+
56
+ None
57
+
58
+ == INSTALL:
59
+
60
+ * gem install enumerabler
61
+
62
+ == LICENSE:
63
+
64
+ Copyright:: Yusuke Endoh <mame@tsg.ne.jp>
65
+ License:: Ruby's
@@ -0,0 +1,11 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.new('enumerabler', '1.0.0') do |p|
7
+ p.rubyforge_name = "enumerabler"
8
+ p.developer('Yusuke Endoh', 'mame@tsg.ne.jp')
9
+ end
10
+
11
+ # vim: syntax=Ruby
@@ -0,0 +1,112 @@
1
+ module Enumerable
2
+ def grepper(pat, &blk)
3
+ Enumerator.new do |e|
4
+ each do |x|
5
+ e << (blk ? blk[x] : x) if pat === x
6
+ end
7
+ end
8
+ end
9
+
10
+ def finder_all(&blk)
11
+ Enumerator.new do |e|
12
+ each do |x|
13
+ e << x if blk[x]
14
+ end
15
+ end
16
+ end
17
+ alias all_finder finder_all
18
+ alias selector finder_all
19
+
20
+ def rejecter(&blk)
21
+ Enumerator.new do |e|
22
+ each do |x|
23
+ e << x unless blk[x]
24
+ end
25
+ end
26
+ end
27
+
28
+ def collector(&blk)
29
+ Enumerator.new do |e|
30
+ each do |x|
31
+ e << blk[x]
32
+ end
33
+ end
34
+ end
35
+ alias mapper collector
36
+
37
+ def flat_mapper(&blk)
38
+ Enumerator.new do |e|
39
+ each do |a|
40
+ blk[a].each do |x|
41
+ e << x
42
+ end
43
+ end
44
+ end
45
+ end
46
+ alias concat_collector flat_mapper
47
+
48
+ def zipper(*ary, &blk)
49
+ Enumerator.new do |e|
50
+ if ary.all? {|a| a.is_a?(Array) }
51
+ i = 0
52
+ each do |x|
53
+ e << [x] + ary.map {|a| a[i] }
54
+ i += 1
55
+ end
56
+ else
57
+ ary = ary.map! {|a| a.to_enum }
58
+ each do |x|
59
+ a = ary.map.with_index do |a, i|
60
+ next nil if a == nil
61
+ begin
62
+ a.next
63
+ rescue StopIteration
64
+ ary[i] = nil
65
+ end
66
+ end
67
+ e << [x] + a
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ def taker(n)
74
+ Enumerator.new do |e|
75
+ i = 0
76
+ each do |x|
77
+ break if i == n
78
+ e << x
79
+ i += 1
80
+ end
81
+ end
82
+ end
83
+
84
+ def taker_while(&blk)
85
+ Enumerator.new do |e|
86
+ each do |x|
87
+ break unless blk[x]
88
+ e << x
89
+ end
90
+ end
91
+ end
92
+
93
+ def dropper(n)
94
+ Enumerator.new do |e|
95
+ i = 0
96
+ each do |x|
97
+ e << x if i >= n
98
+ i += 1
99
+ end
100
+ end
101
+ end
102
+
103
+ def dropper_while(&blk)
104
+ Enumerator.new do |e|
105
+ flag = false
106
+ each do |x|
107
+ flag = true unless flag || blk[x]
108
+ e << x if flag
109
+ end
110
+ end
111
+ end
112
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enumerabler
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yusuke Endoh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-11 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.3
24
+ version:
25
+ description: enumerabler enhances Enumerable with methods returning enumerator.
26
+ email:
27
+ - mame@tsg.ne.jp
28
+ executables: []
29
+
30
+ extensions: []
31
+
32
+ extra_rdoc_files:
33
+ - History.txt
34
+ - Manifest.txt
35
+ - README.txt
36
+ files:
37
+ - History.txt
38
+ - Manifest.txt
39
+ - README.txt
40
+ - Rakefile
41
+ - lib/enumerabler.rb
42
+ has_rdoc: true
43
+ homepage: http://github.com/mame/enumerabler/tree/master
44
+ licenses: []
45
+
46
+ post_install_message:
47
+ rdoc_options:
48
+ - --main
49
+ - README.txt
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ requirements: []
65
+
66
+ rubyforge_project: enumerabler
67
+ rubygems_version: 1.3.5
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: enumerabler enhances Enumerable with methods returning enumerator.
71
+ test_files: []
72
+