xenum 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49676029dfbb587b8ac7a7211b8695f61665d620a7344701f8ac9589b0a69df1
4
- data.tar.gz: 9ed131434678efa71892e8291c27b87303b8bc142b748a65801e6481b23f5986
3
+ metadata.gz: a22147054180684998dfbea79223da8a588abf7e0f923e3a1189b76a52d4335e
4
+ data.tar.gz: bd0b21403fa4d114cbb5139f1c514226648f8de71406da76b6bfb086375346fb
5
5
  SHA512:
6
- metadata.gz: e757c26e20bc7056172f08a3fb3cf27a8b2073ee1e5b1c71bd2b518f10869f01caca5365b7228bc6477a6ebf91091db55afdc5507b874b70f9028a4942d208c6
7
- data.tar.gz: f1b94ca948f910e36485c5f1eedaa4b6694459d520795ffe782403e69e385fb272252eb69394ebc8aedce3a5c8be238b2eee769ea563df68209ddd5747ab647f
6
+ metadata.gz: 94efb08dd1112f2bd67b3380b2e104d48392ff0467f39b28e9830b686de9778d5956a43db1f353b31b371e77585ea836a260b9951c89d5ba91d705ad0617f6e4
7
+ data.tar.gz: fdbaafde2073b72fbb450dcab5a134d7002cdefab5a89428a3977caaee0aac7eaaf1ef5dd9e6cf4ae82417032ddcc723931579f7a271507ab326634e88fb7329
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xenum (0.1.0)
4
+ xenum (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -14,14 +14,49 @@ If bundler is not being used to manage dependencies, install the gem by executin
14
14
 
15
15
  ## Usage
16
16
 
17
- `lazy_product` works like `Array#product`, but not limited to `Array`
17
+ ### lazy_flatten
18
+
19
+ works like `Array#flatten`, but for all `Enumerable`, and it is lazy
18
20
 
19
21
  ```ruby
20
- 3.times.lazy_product((3..5), [6,7,8]).take(6)
22
+ [
23
+ 3.times,
24
+ 3,
25
+ 4,
26
+ [5, [6,7]],
27
+ (8..10),
28
+ Enumerator.new{|e| n = 10; loop{e << n+=1}}
29
+ ].lazy_flatten.first(15)
30
+ # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
31
+ ```
32
+
33
+ ### lazy_insert
34
+
35
+ works like `Array#insert`, but not limited to `Array`
36
+
37
+ ```ruby
38
+ 10.times.lazy_insert(3, 'a', 'b').to_a
39
+ # [0, 1, 2, "a", "b", 3, 4, 5, 6, 7, 8, 9]
40
+
41
+ 10.times.lazy_insert(-3, 'a', 'b').to_a
42
+ # [0, 1, 2, 3, 4, 5, 6, 7, "a", "b", 8, 9]
43
+ ```
44
+
45
+ ### lazy_product
46
+
47
+ works like `Array#product`, but not limited to `Array`
48
+
49
+ ```ruby
50
+ 3.times.lazy_product(
51
+ (3..5),
52
+ [6,7,8]
53
+ ).take(6)
21
54
  # [[0, 3, 6], [0, 3, 7], [0, 3, 8], [0, 4, 6], [0, 4, 7], [0, 4, 8]]
22
55
  ```
23
56
 
24
- `merge_sort` lazily merge sort two sorted `Enumerable`
57
+ ### merge_sort
58
+
59
+ lazily merge sort two sorted `Enumerable`
25
60
 
26
61
  ```ruby
27
62
  e = (6..8).merge_sort([3,4,5]).merge_sort(3.times)
data/lib/xenum/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Xenum
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.2"
5
5
  end
data/lib/xenum.rb CHANGED
@@ -7,6 +7,35 @@ module Xenum
7
7
  end
8
8
 
9
9
  module Enumerable
10
+ def lazy_flatten(level = nil)
11
+ these = self
12
+ level = -1 if level.nil?
13
+
14
+ Enumerator.new do |yielder|
15
+ level.nil?
16
+ these.each do |this|
17
+ if Enumerable === this && level != 0
18
+ this.lazy_flatten(level - 1).each do |sub|
19
+ yielder.yield(sub)
20
+ end
21
+ next
22
+ end
23
+
24
+ yielder.yield(this)
25
+ end
26
+ end
27
+ end
28
+
29
+ def lazy_insert(index, *objs)
30
+ return self if objs.empty?
31
+
32
+ if index >= 0
33
+ lazy_insert_pos(index, objs)
34
+ else
35
+ lazy_insert_neg(index, objs)
36
+ end
37
+ end
38
+
10
39
  def lazy_product(*enums)
11
40
  if enums.empty?
12
41
  return Enumerator.new do |yielder|
@@ -73,4 +102,48 @@ module Enumerable
73
102
  end
74
103
  end
75
104
  end
105
+
106
+ private
107
+
108
+ def lazy_insert_neg(index, objs)
109
+ these = Enumerator === self ? self : self.to_enum
110
+ queue = []
111
+
112
+ (index.abs - 1).times do
113
+ begin
114
+ queue << these.next
115
+ rescue StopIteration
116
+ raise IndexError, "index #{index} too small; minimum: #{-(queue.size + 1)}"
117
+ end
118
+ end
119
+
120
+ Enumerator.new do |yielder|
121
+ loop do
122
+ begin
123
+ queue << these.next
124
+ yielder << queue.shift
125
+ rescue StopIteration
126
+ break
127
+ end
128
+ end
129
+ objs.each{ |obj| yielder << obj }
130
+ queue.each{ |this| yielder << this }
131
+ end
132
+ end
133
+
134
+ def lazy_insert_pos(index, objs)
135
+ these = self
136
+ Enumerator.new do |yielder|
137
+ current_index = -1
138
+ these.each do |this|
139
+ current_index += 1
140
+ objs.each{ |obj| yielder << obj } if current_index == index
141
+ yielder << this
142
+ end
143
+ if current_index < index
144
+ ((current_index + 1)...index).each{ yielder << nil }
145
+ objs.each{ |obj| yielder << obj }
146
+ end
147
+ end
148
+ end
76
149
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xenum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ken
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-14 00:00:00.000000000 Z
11
+ date: 2024-03-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: