Class: Stack
Class Method Summary collapse
Instance Method Summary collapse
- #each(&prc) ⇒ Object
- #each_from_top(&prc) ⇒ Object
- #empty? ⇒ Boolean
-
#initialize(value = nil) ⇒ Stack
constructor
A new instance of Stack.
- #length ⇒ Object
- #max ⇒ Object
- #min ⇒ Object
- #peek ⇒ Object
- #pop ⇒ Object
- #push(value) ⇒ Object
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
52 53 54 |
# File 'lib/adt_utilit/stack.rb', line 52 def empty? @stack.length == 0 end |
#length ⇒ Object
48 49 50 |
# File 'lib/adt_utilit/stack.rb', line 48 def length @stack.length end |
#max ⇒ Object
43 44 45 46 |
# File 'lib/adt_utilit/stack.rb', line 43 def max return nil if @stack.empty? @stack.last[:max] end |
#min ⇒ Object
38 39 40 41 |
# File 'lib/adt_utilit/stack.rb', line 38 def min return nil if @stack.empty? @stack.last[:min] end |
#peek ⇒ Object
33 34 35 36 |
# File 'lib/adt_utilit/stack.rb', line 33 def peek return nil if @stack.empty? @stack.last[:value] end |
#pop ⇒ Object
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 |