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 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
+