Class: Stack

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/adt_utilit/stack.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(value = nil) ⇒ Stack

Returns a new instance of Stack.



3
4
5
6
7
8
9
10
11
12
13
14
# File 'lib/adt_utilit/stack.rb', line 3

def initialize(value = nil)
  @stack = []
  if value.nil?
    return
  elsif value.is_a?(Array)
    value.each do |el|
      push(el)
    end
  else
    push(value)
  end
end

Class Method Details

.new_with_metadata(metadata_name, &prc) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/adt_utilit/stack.rb', line 16

def self.(, &prc)
  stack = self.new
  stack.instance_variable_set(:@metadata, {max: "#{}_max", min: "#{}_min", proc: prc})

  define_method("#{}_max"){
    raise "such metadata has not been set for this instance" if @metadata.nil?
    return nil if @stack.empty?
    @stack.last[@metadata[:max]]
  }
  define_method("#{}_min"){
    raise "such metadata has not been set for this instance" if @metadata.nil?
    return nil if @stack.empty?
    @stack.last[@metadata[:min]]
  }
  stack
end

Instance Method Details

#each(&prc) ⇒ Object



92
93
94
95
96
# File 'lib/adt_utilit/stack.rb', line 92

def each(&prc)
  @stack.each do |el|
    prc.call(el[:value])
  end
end

#each_from_top(&prc) ⇒ Object



98
99
100
101
102
103
# File 'lib/adt_utilit/stack.rb', line 98

def each_from_top(&prc)
  (@stack.length - 1).downto(0) do |i|
    prc.call(@stack[i][:value])
  end
  self
end

#empty?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/adt_utilit/stack.rb', line 52

def empty?
  @stack.length == 0
end

#lengthObject



48
49
50
# File 'lib/adt_utilit/stack.rb', line 48

def length
  @stack.length
end

#maxObject



43
44
45
46
# File 'lib/adt_utilit/stack.rb', line 43

def max
  return nil if @stack.empty?
  @stack.last[:max]
end

#minObject



38
39
40
41
# File 'lib/adt_utilit/stack.rb', line 38

def min
  return nil if @stack.empty?
  @stack.last[:min]
end

#peekObject



33
34
35
36
# File 'lib/adt_utilit/stack.rb', line 33

def peek
  return nil if @stack.empty?
  @stack.last[:value]
end

#popObject



86
87
88
89
90
# File 'lib/adt_utilit/stack.rb', line 86

def pop
  return nil if @stack.empty?
  top_el = @stack.pop
  top_el[:value]
end

#push(value) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/adt_utilit/stack.rb', line 56

def push(value)
  stack_el = {value: value}
  if @stack.empty?
    stack_el[:max] = stack_el[:min] = stack_el[:value]
    unless @metadata.nil?
      stack_el[@metadata[:max]] = stack_el[@metadata[:min]] = stack_el[:value]
    end
  else
    stack_el[:max] = stack_el[:value] >= max ? stack_el[:value] : max
    stack_el[:min] = stack_el[:value] <= min ? stack_el[:value] : min
    if @metadata
      proc = @metadata[:proc]

      if proc.call(stack_el[:value]) >= proc.call(self.send("#{@metadata[:max]}"))
        stack_el[@metadata[:max]] = stack_el[:value]
      else
        stack_el[@metadata[:max]] = self.send("#{@metadata[:max]}")
      end

      if proc.call(stack_el[:value]) <= proc.call(self.send("#{@metadata[:min]}"))
        stack_el[@metadata[:min]] = stack_el[:value]
      else
        stack_el[@metadata[:min]] = self.send("#{@metadata[:min]}")
      end
    end
  end
  @stack << stack_el
  self
end