Class: Clacky::Utils::LimitStack

Inherits:
Object
  • Object
show all
Defined in:
lib/clacky/utils/limit_stack.rb

Overview

Auto-rolling fixed-size array Automatically discards oldest elements when size limit is exceeded

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(max_size: 5000) ⇒ LimitStack

Returns a new instance of LimitStack.



10
11
12
13
# File 'lib/clacky/utils/limit_stack.rb', line 10

def initialize(max_size: 5000)
  @max_size = max_size
  @items = []
end

Instance Attribute Details

#itemsObject (readonly)

Returns the value of attribute items.



8
9
10
# File 'lib/clacky/utils/limit_stack.rb', line 8

def items
  @items
end

#max_sizeObject (readonly)

Returns the value of attribute max_size.



8
9
10
# File 'lib/clacky/utils/limit_stack.rb', line 8

def max_size
  @max_size
end

Instance Method Details

#clearObject

Clear all elements



65
66
67
68
# File 'lib/clacky/utils/limit_stack.rb', line 65

def clear
  @items.clear
  self
end

#each(&block) ⇒ Object

Iterate over elements



71
72
73
# File 'lib/clacky/utils/limit_stack.rb', line 71

def each(&block)
  @items.each(&block)
end

#empty?Boolean

Check if empty

Returns:

  • (Boolean)


60
61
62
# File 'lib/clacky/utils/limit_stack.rb', line 60

def empty?
  @items.empty?
end

#last(n = nil) ⇒ Object

Get last N elements



40
41
42
# File 'lib/clacky/utils/limit_stack.rb', line 40

def last(n = nil)
  n ? @items.last(n) : @items.last
end

#popObject

Remove and return the last element



35
36
37
# File 'lib/clacky/utils/limit_stack.rb', line 35

def pop
  @items.pop
end

#push(*elements) ⇒ Object Also known as: <<

Add elements (supports single or multiple)



16
17
18
19
20
21
22
# File 'lib/clacky/utils/limit_stack.rb', line 16

def push(*elements)
  elements.each do |element|
    @items << element
    trim_if_needed
  end
  self
end

#push_lines(text) ⇒ Object

Add multi-line text (split by lines and add)



26
27
28
29
30
31
32
# File 'lib/clacky/utils/limit_stack.rb', line 26

def push_lines(text)
  return self if text.nil? || text.empty?

  lines = text.is_a?(Array) ? text : text.lines
  lines.each { |line| push(line) }
  self
end

#sizeObject

Current size



55
56
57
# File 'lib/clacky/utils/limit_stack.rb', line 55

def size
  @items.size
end

#to_aObject

Get all elements



45
46
47
# File 'lib/clacky/utils/limit_stack.rb', line 45

def to_a
  @items.dup
end

#to_sObject

Convert to string (for text content)



50
51
52
# File 'lib/clacky/utils/limit_stack.rb', line 50

def to_s
  @items.join
end

#trim_if_neededObject



76
77
78
79
80
81
# File 'lib/clacky/utils/limit_stack.rb', line 76

def trim_if_needed
  if @items.size > @max_size
    # Remove oldest elements, keep only the latest max_size items
    @items.shift(@items.size - @max_size)
  end
end