lazer 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/lazer.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'lazer/lazy_enumerable.rb'
2
+ require 'lazer/generators.rb'
@@ -0,0 +1,11 @@
1
+ module Lazer
2
+ def Lazer.naturals
3
+ Enumerator.new do |yielder|
4
+ number = 1
5
+ loop do
6
+ yielder.yield number
7
+ number += 1
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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
+