class Algorithmix::DataStructure::Generic::Deque

Public Class Methods

new(obj = nil, copy: false) click to toggle source

Creates a new deque.

@param obj [#to_a] @kwarg copy [true, false] @return newly created deque @raise ArgumentError, if given obj doesn't respond to to_a method

# File lib/algorithmix/data_structure/generic/deque.rb, line 15
def initialize(obj = nil, copy: false)
  @container = []
  obj.nil? ? nil : from_obj(obj, copy)
end

Public Instance Methods

!=(deque) click to toggle source

Compares contents of the deque and a deque given as argument.

@param deque [Deque] @return [true, false] @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 135
def !=(deque)
  raise ArgumentError, "Undefined method Deque#!= for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container != deque.to_a
end
&(deque) click to toggle source

Finds intersection of contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] a new deque @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 234
def &(deque)
  raise ArgumentError, "Undefined method Deque#& for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  Deque.new(@container & deque.to_a)
end
+(deque) click to toggle source

Concatenates contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] a new deque @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 163
def +(deque)
  raise ArgumentError, "Undefined method Deque#+ for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  Deque.new(@container + deque.to_a)
end
-(deque) click to toggle source

Finds difference of contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] a new deque @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 261
def -(deque)
  raise ArgumentError, "Undefined method Deque#- for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  Deque.new(@container - deque.to_a)
end
<<(value) click to toggle source

(see push_back)

# File lib/algorithmix/data_structure/generic/deque.rb, line 54
def <<(value)
  push_back(value)
end
<=>(deque) click to toggle source

Compares contents of the deque and a deque given as argument.

@param deque [Deque] @return 1, if content of the deque is greater than content of the given deque,

0, if contents are equal
-1, if content of the second deque is greater than content of self object

@raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 153
def <=>(deque)
  raise ArgumentError, "Undefined method Deque#<=> for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container <=> deque.to_a
end
==(deque) click to toggle source

Compares contents of the deque and a deque given as argument.

@param deque [Deque] @return [true, false] @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 119
def ==(deque)
  raise ArgumentError, "Undefined method Deque#== for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container == deque.to_a
end
>>(value) click to toggle source

(see push_front)

# File lib/algorithmix/data_structure/generic/deque.rb, line 40
def >>(value)
  push_front(value)
end
[](idx) click to toggle source

Returns the element at given index.

@param idx @return element at given position, or nil if there is no element at that index.

# File lib/algorithmix/data_structure/generic/deque.rb, line 105
def [](idx)
  @container[idx]
end
^(deque) click to toggle source

Finds symmetric difference of contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] a new deque @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 288
def ^(deque)
  raise ArgumentError, "Undefined method Deque#^ for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  Deque.new((@container | deque.to_a) - (@container & deque.to_a))
end
apply(&block) click to toggle source

(see map)

# File lib/algorithmix/data_structure/generic/deque.rb, line 378
def apply(&block)
  map(&block)
end
apply!(&block) click to toggle source

(see map!)

# File lib/algorithmix/data_structure/generic/deque.rb, line 383
def apply!(&block)
  map!(&block)
end
assign(obj, copy: false) click to toggle source

Assigns content of an obj, to content of the deque.

@param obj [#to_a] @kwarg copy [true, false] by default is set to false, which means that no copy of the object will be made @raise ArgumentError, if given object doesn't respond to to_a method @return self object

# File lib/algorithmix/data_structure/generic/deque.rb, line 26
def assign(obj, copy: false)
  from_obj(obj, copy)
end
at(idx) click to toggle source

(see [])

# File lib/algorithmix/data_structure/generic/deque.rb, line 110
def at(idx)
  @container[idx]
end
back() click to toggle source

Returns last element of the deque.

# File lib/algorithmix/data_structure/generic/deque.rb, line 82
def back
  @container.last
end
clear() click to toggle source

Clears content of the deque.

@return self object

# File lib/algorithmix/data_structure/generic/deque.rb, line 318
def clear
  @container = []
  self
end
concat(deque) click to toggle source

(see +)

# File lib/algorithmix/data_structure/generic/deque.rb, line 169
def concat(deque)
  raise ArgumentError, "Undefined method Deque#concat for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self + deque
end
concat!(deque) click to toggle source

Concatenates contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] self object @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 185
def concat!(deque)
  raise ArgumentError, "Undefined method Deque#concat! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container += deque.to_a
  self
end
diff?(deque) click to toggle source

(see #!=)

# File lib/algorithmix/data_structure/generic/deque.rb, line 141
def diff?(deque)
  raise ArgumentError, "Undefined method Deque#diff? for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self != deque
end
difference(deque) click to toggle source

(see -)

# File lib/algorithmix/data_structure/generic/deque.rb, line 267
def difference(deque)
  raise ArgumentError, "Undefined method Deque#difference for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self - deque
end
difference!(deque) click to toggle source

Finds difference of contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] a new deque @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 277
def difference!(deque)
  raise ArgumentError, "Undefined method Deque#difference! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container -= deque.to_a
  self
end
empty?() click to toggle source

Checks if the deque is empty.

# File lib/algorithmix/data_structure/generic/deque.rb, line 87
def empty?
  @container.empty?
end
eql?(deque) click to toggle source

(see #==)

# File lib/algorithmix/data_structure/generic/deque.rb, line 125
def eql?(deque)
  raise ArgumentError, "Undefined method Deque#eql? for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self == deque
end
filter(&block) click to toggle source

(see select)

# File lib/algorithmix/data_structure/generic/deque.rb, line 341
def filter(&block)
  select(&block)
end
filter!(&block) click to toggle source

(see select!)

# File lib/algorithmix/data_structure/generic/deque.rb, line 346
def filter!(&block)
  select!(&block)
end
find_all(&block) click to toggle source

(see select)

# File lib/algorithmix/data_structure/generic/deque.rb, line 351
def find_all(&block)
  select(&block)
end
find_all!(&block) click to toggle source

(see select!)

# File lib/algorithmix/data_structure/generic/deque.rb, line 356
def find_all!(&block)
  select!(&block)
end
front() click to toggle source

Returns first element of the deque.

# File lib/algorithmix/data_structure/generic/deque.rb, line 77
def front
  @container.first
end
intersect(deque) click to toggle source

(see #&)

# File lib/algorithmix/data_structure/generic/deque.rb, line 240
def intersect(deque)
  raise ArgumentError, "Undefined method Deque#intersect for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self & deque
end
intersect!(deque) click to toggle source

Finds intersection of contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] self object @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 250
def intersect!(deque)
  raise ArgumentError, "Undefined method Deque#intersect! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container &= deque.to_a
  self
end
length() click to toggle source

(see size)

# File lib/algorithmix/data_structure/generic/deque.rb, line 97
def length
  @container.size
end
map(&block) click to toggle source

Applies a function to each element of the deque.

@param &block @return [Deque] a new deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 364
def map(&block)
  Deque.new(@container.map { |e| block.call(e)})
end
map!(&block) click to toggle source

Applies a function to each element of the deque.

@param &block @return [Deque] self object

# File lib/algorithmix/data_structure/generic/deque.rb, line 372
def map!(&block)
  @container.map! { |e| block.call(e)}
  self
end
merge(deque) click to toggle source

(see +)

# File lib/algorithmix/data_structure/generic/deque.rb, line 175
def merge(deque)
  raise ArgumentError, "Undefined method Deque#merge for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self + deque
end
merge!(deque) click to toggle source

Concatenates contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] self object @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 196
def merge!(deque)
  raise ArgumentError, "Undefined method Deque#merge! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container += deque.to_a
  self
end
pop_back() click to toggle source

Removes last element of the deque.

@raise Algorithmix::EmptyContainerError, if the deque is empty. @return last element of the deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 71
def pop_back
  raise EmptyContainerError, "The deque is empty." if @container.empty?
  @container.pop
end
pop_front() click to toggle source

Removes first element of the deque.

@raise Algorithmix::EmptyContainerError, if the deque is empty. @return first element of the deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 62
def pop_front
  raise EmptyContainerError, "The deque is empty." if @container.empty?
  @container.shift
end
push_back(value) click to toggle source

Inserts a new element at the end of the deque.

@param value @return self object

# File lib/algorithmix/data_structure/generic/deque.rb, line 48
def push_back(value)
  @container << value
  self
end
push_front(value) click to toggle source

Inserts a new element at the beginning of the deque.

@param value @return self object

# File lib/algorithmix/data_structure/generic/deque.rb, line 34
def push_front(value)
  @container.unshift(value)
  self
end
select(&block) click to toggle source

Filters elements of the deque by given condition.

@param &block @return [Deque] a new deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 327
def select(&block)
  Deque.new( @container.select { |e| block.call(e)})
end
select!(&block) click to toggle source

Filters elements of the deque by given condition.

@param &block @return [Deque] self object

# File lib/algorithmix/data_structure/generic/deque.rb, line 335
def select!(&block)
  @container.select! { |e| block.call(e)}
  self
end
size() click to toggle source

Returns size of the deque.

# File lib/algorithmix/data_structure/generic/deque.rb, line 92
def size
  @container.size
end
symmetric_difference(deque) click to toggle source

(see symmetric_difference)

# File lib/algorithmix/data_structure/generic/deque.rb, line 294
def symmetric_difference(deque)
  raise ArgumentError, "Undefined method Deque#symmetric_difference for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self ^ deque
end
symmetric_difference!(deque) click to toggle source

Finds symmetric difference of contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] self object @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 304
def symmetric_difference!(deque)
  raise ArgumentError, "Undefined method Deque#symmetric_difference! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container = (@container | deque.to_a) - (@container & deque.to_a)
  self
end
to_a() click to toggle source

Converts content of the deque to an array witl elements.

# File lib/algorithmix/data_structure/generic/deque.rb, line 311
def to_a
  @container
end
union(deque) click to toggle source

(see #|)

# File lib/algorithmix/data_structure/generic/deque.rb, line 213
def union(deque)
  raise ArgumentError, "Undefined method Deque#union for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  self | deque
end
union!(deque) click to toggle source

Unites contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] self object @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 223
def union!(deque)
  raise ArgumentError, "Undefined method Deque#union! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  @container |= deque.to_a
  self
end
|(deque) click to toggle source

Unites contents of the deque and a deque given as argument.

@param deque [Deque] @return [Deque] a new deque @raise ArgumentError, if given object is not a deque

# File lib/algorithmix/data_structure/generic/deque.rb, line 207
def |(deque)
  raise ArgumentError, "Undefined method Deque#| for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
  Deque.new(@container | deque.to_a)
end

Private Instance Methods

from_obj(obj, copy) click to toggle source
# File lib/algorithmix/data_structure/generic/deque.rb, line 389
def from_obj(obj, copy)
  raise ArgumentError, "Object doesn't respond to #to_a method" unless obj.respond_to?(:to_a)

  @container = copy ? obj.send(:to_a).dup : obj.send(:to_a)
  self
end