lazer 0.0.0
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.
- data/lib/lazer.rb +2 -0
- data/lib/lazer/generators.rb +11 -0
- data/lib/lazer/lazy_enumerable.rb +131 -0
- metadata +72 -0
data/lib/lazer.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
module Enumerable
|
2
|
+
def at_lazy(n)
|
3
|
+
self.each_with_index do |val, index|
|
4
|
+
return val if index == n
|
5
|
+
end
|
6
|
+
nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def drop_lazy(n)
|
10
|
+
get_some{|yielder, val, index| yielder << val if index >= n}
|
11
|
+
end
|
12
|
+
|
13
|
+
def drop_while_lazy(&block)
|
14
|
+
found = false
|
15
|
+
get_some do |yielder, val|
|
16
|
+
next if block.(val) && !found
|
17
|
+
found = true
|
18
|
+
yielder << val
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def grep_lazy(pattern, &block)
|
23
|
+
get_some {|yielder, val| yielder << (block_given? ? block.(val) : val) if pattern === val}
|
24
|
+
end
|
25
|
+
|
26
|
+
def flatten_lazy(&block)
|
27
|
+
get_some do |yielder, val|
|
28
|
+
block.(val).each do |inner_val|
|
29
|
+
yielder << inner_val
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def map_lazy(&block)
|
35
|
+
get_some {|yielder, val| yielder << block.(val)}
|
36
|
+
end
|
37
|
+
|
38
|
+
alias collect_lazy map_lazy
|
39
|
+
|
40
|
+
def reject_lazy(&block)
|
41
|
+
self.select_lazy{|val| !block.(val)}
|
42
|
+
end
|
43
|
+
|
44
|
+
def select_lazy(&block)
|
45
|
+
get_some {|yielder, val| yielder << val if block.(val)}
|
46
|
+
end
|
47
|
+
|
48
|
+
alias find_all_lazy select_lazy
|
49
|
+
|
50
|
+
def slice_lazy(index, length=1)
|
51
|
+
start, finish = index.begin, index.end if index.instance_of? Range
|
52
|
+
start, finish = index, index + length - 1 if index.instance_of? Fixnum
|
53
|
+
|
54
|
+
get_some do |yielder, val, index|
|
55
|
+
next if index < start
|
56
|
+
throw :done if index > finish
|
57
|
+
yielder << val
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def take_lazy(n)
|
62
|
+
get_some do |yielder, val, index|
|
63
|
+
yielder << val
|
64
|
+
throw :done if index == n-1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def take_while_lazy(&block)
|
69
|
+
get_some do |yielder, val|
|
70
|
+
throw :done unless block.(val)
|
71
|
+
yielder << val
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def flatten_lazy(&block)
|
76
|
+
Enumerator.new do |yielder|
|
77
|
+
self.each do |val|
|
78
|
+
block.(val).each do |inner_val|
|
79
|
+
yielder << inner_val
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
#this is disgusting, and the reason why Enumerator needs a has_next?
|
86
|
+
def zip_lazy(*args, &block)
|
87
|
+
rators = ([self] + args).map{|arr| arr.each}
|
88
|
+
Enumerator.new do |yielder|
|
89
|
+
loop do
|
90
|
+
answer = rators.map do |rator|
|
91
|
+
begin
|
92
|
+
[rator.better_next, true]
|
93
|
+
rescue StopIteration
|
94
|
+
[nil, false]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
break if answer.none?{|val, signal| signal}
|
98
|
+
output = answer.map{|val, signal| val}
|
99
|
+
output = block.(output) if block_given?
|
100
|
+
yielder << output
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def get_some
|
108
|
+
Enumerator.new do |yielder|
|
109
|
+
catch :done do
|
110
|
+
self.each_with_index do |value, index|
|
111
|
+
yield yielder, value, index
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Enumerator
|
119
|
+
def better_next
|
120
|
+
if @no_more
|
121
|
+
raise StopIteration
|
122
|
+
else
|
123
|
+
begin
|
124
|
+
self.next
|
125
|
+
rescue StopIteration
|
126
|
+
@no_more = true
|
127
|
+
raise StopIteration
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lazer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 0.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Isaac Camberon
|
14
|
+
- Jonathan Palmer
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-08-10 00:00:00 -04:00
|
20
|
+
default_executable:
|
21
|
+
dependencies: []
|
22
|
+
|
23
|
+
description: Lazer is a set lazy implemetations of Enumerable methods
|
24
|
+
email:
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- lib/lazer/lazy_enumerable.rb
|
33
|
+
- lib/lazer/generators.rb
|
34
|
+
- lib/lazer.rb
|
35
|
+
has_rdoc: true
|
36
|
+
homepage: http://github.com/icambron/lazer
|
37
|
+
licenses: []
|
38
|
+
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
hash: 49
|
50
|
+
segments:
|
51
|
+
- 1
|
52
|
+
- 9
|
53
|
+
- 1
|
54
|
+
version: 1.9.1
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
requirements: []
|
65
|
+
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 1.3.7
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: Lazy Enumerators for Ruby
|
71
|
+
test_files: []
|
72
|
+
|