philiprehberger-ring_buffer 0.7.0 → 0.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c341e6a009acc45d1b8ca3ca03851ae4d1f3b713396b23f7be323e53908579d2
4
- data.tar.gz: f53265859bebd7feec3f5f664f619ac82fb34f047019bb9316855be31c22cda1
3
+ metadata.gz: 7c4971ce57872af1d067144dcc2f47be6361c2223b33f3d3fe64e52be9a5b436
4
+ data.tar.gz: da55e74cbcb7de740c01f7867f4667de5e605f64cb3d2c87e36dd7ab5cfe80ac
5
5
  SHA512:
6
- metadata.gz: 710ec989953bac0172e8358fe9eefa1ecf62ab0950522770c34bf7df2f8f17590c1ff5440ee5254897d8b3172bc697a54d168764be622bd6f280af2459600255
7
- data.tar.gz: 84b6227b2fdabb56f9b3aae4e595fdda1db5906f145c35f7c7b994d163bd8254db49b8549a7197242d2135fac0fc9ecc9da7f43e715d8f9315fe9f66d1871b78
6
+ metadata.gz: c1d3172843fb04b1c5a1119899b1977cfaf1e4d8f04d5035615a05813cc364377f86b05dd2206e845582e23fa4eee273adfa7bd6f34a5b1f9fd4ebfdff531d91
7
+ data.tar.gz: c644de2e1a605a9675b318aae413e5de527ed08e51d2987ffd936bde5de97391ac8c005b60402799f605e01ff93f1281336a1659f3caf11d21f00628c6bbc7ff
data/CHANGELOG.md CHANGED
@@ -7,6 +7,11 @@ and this gem adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.0] - 2026-04-28
11
+
12
+ ### Added
13
+ - `RingBuffer#each_chunk(size)` — yield successive non-overlapping chunks of `size` elements (oldest first). Returns an Enumerator without a block. Raises `Error` for non-positive sizes.
14
+
10
15
  ## [0.7.0] - 2026-04-21
11
16
 
12
17
  ### Added
data/README.md CHANGED
@@ -167,6 +167,22 @@ buf.sample # => random element
167
167
  buf.sample(2) # => [random, random]
168
168
  ```
169
169
 
170
+ ### Chunked Iteration
171
+
172
+ Yield successive non-overlapping chunks of fixed size in oldest-first order.
173
+ The final chunk may be shorter:
174
+
175
+ ```ruby
176
+ buf = Philiprehberger::RingBuffer.new(10)
177
+ (1..7).each { |v| buf.push(v) }
178
+
179
+ buf.each_chunk(2).to_a # => [[1, 2], [3, 4], [5, 6], [7]]
180
+
181
+ buf.each_chunk(3) do |chunk|
182
+ process_batch(chunk)
183
+ end
184
+ ```
185
+
170
186
  ### Enumerable
171
187
 
172
188
  ```ruby
@@ -210,6 +226,7 @@ buf.select(&:odd?) # => [1, 3]
210
226
  | `#ema(alpha:)` | Exponential moving average (single float) |
211
227
  | `#range` | Spread between min and max numeric elements |
212
228
  | `#count_by(&block)` | Bucketed counts by block return value |
229
+ | `#each_chunk(size)` | Yield successive non-overlapping chunks of `size` elements (oldest first) |
213
230
 
214
231
  ## Development
215
232
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Philiprehberger
4
4
  class RingBuffer
5
- VERSION = '0.7.0'
5
+ VERSION = '0.8.0'
6
6
  end
7
7
  end
@@ -361,5 +361,22 @@ module Philiprehberger
361
361
  each { |element| result[block.call(element)] += 1 }
362
362
  result
363
363
  end
364
+
365
+ # Yield successive non-overlapping chunks of `size` elements (oldest first)
366
+ #
367
+ # The final chunk may be shorter than `size` if the buffer length is not
368
+ # a multiple of `size`. An empty buffer yields nothing.
369
+ #
370
+ # @param size [Integer] chunk size (must be positive)
371
+ # @yield [chunk] each chunk in oldest-to-newest order
372
+ # @yieldparam chunk [Array] up to `size` elements
373
+ # @return [Enumerator] when no block is given
374
+ # @raise [Error] when `size` is not a positive integer
375
+ def each_chunk(size, &block)
376
+ raise Error, 'size must be a positive integer' unless size.is_a?(Integer) && size.positive?
377
+ return enum_for(:each_chunk, size) unless block
378
+
379
+ to_a.each_slice(size, &block)
380
+ end
364
381
  end
365
382
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: philiprehberger-ring_buffer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philip Rehberger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-21 00:00:00.000000000 Z
11
+ date: 2026-04-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Fixed-capacity ring buffer that overwrites oldest entries on overflow,
14
14
  with index access, push/pop/shift mutation, oldest/newest peek, built-in statistics