Class: ROC::List

Inherits:
Base
  • Object
show all
Extended by:
Types::MethodGenerators
Includes:
Types::ArrayType, Types::SortableType
Defined in:
lib/roc/objects/list.rb

Instance Attribute Summary

Attributes inherited from Base

#key, #options

Instance Method Summary collapse

Methods included from Types::MethodGenerators

deserializing_method, nonserializing_method, serializing_and_deserializing_method, serializing_method, zero_arg_method

Methods included from Types::SortableType

#sort, #sort!

Methods included from Types::ArrayType

#clear, #delete_at, #delete_if, #fill, included, #insert, #inspect, #keep_if, #replace, #to_a, #to_array, #to_ary, #values=

Methods inherited from Base

delegate_methods, #initialize, #method_missing, #respond_to?, #seed

Methods included from Types::AllTypes

#eval

Constructor Details

This class inherits a constructor from ROC::Base

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class ROC::Base

Instance Method Details

#<<(obj) ⇒ Object



142
143
144
# File 'lib/roc/objects/list.rb', line 142

def <<(obj)
  self.push(obj)
end

#[](range_or_num, num = nil) ⇒ Object Also known as: slice

shortcut methods



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/roc/objects/list.rb', line 72

def [](range_or_num, num=nil)
  if range_or_num.is_a?(::Integer)
    if num.nil?
      self.lindex(range_or_num)
    elsif num >= 0
      self.lrange(range_or_num, range_or_num + num - 1)
    else
      raise ArgumentError, 'second arg to [] must be a non-neg integer'
    end
  elsif range_or_num.is_a?(Range)
    self.lrange(range_or_num.first, (range_or_num.exclude_end? ? range_or_num.last - 1 : range_or_num.last))
  else
    if num.nil?
      self.values.slice(range_or_num)
    else
      self.values.slice(range_or_num, num)
    end
  end
end

#[]=(*args) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/roc/objects/list.rb', line 101

def []=(*args)
  case args.size
  when 1
    raise ArgumentError, 'index required'
  when 2
    if args[0].is_a?(::Integer)
      self.lset(*args)
    else
      raise ArgumentError, 'range assignment not supported in []='
    end
  when 3
    raise ArgumentError, 'multiple index assignment not supported in []='
  else
    raise ArgumentError, 'wrong number of args'
  end
end

#clobber(vals) ⇒ Object

implementing ArrayType ##



189
190
191
192
193
194
# File 'lib/roc/objects/list.rb', line 189

def clobber(vals)
  self.storage.multi do 
    self.forget
    vals.each{|v| self << v}
  end
end

#delete(val) ⇒ Object

implement (if posible) destructive methods that would otherwise raise



120
121
122
123
124
125
126
127
# File 'lib/roc/objects/list.rb', line 120

def delete(val)
  count = self.lrem(0, val)
  if count > 0
    val
  else
    nil
  end
end

#firstObject



93
94
95
# File 'lib/roc/objects/list.rb', line 93

def first
  self.lindex(0)
end

#lastObject



97
98
99
# File 'lib/roc/objects/list.rb', line 97

def last
  self.lindex(-1)
end

#linsert(where, pivot, value) ⇒ Object



55
56
57
# File 'lib/roc/objects/list.rb', line 55

def linsert(where, pivot, value)
  self.call :linsert, where, pivot, value
end

#linsert_after(pivot, value) ⇒ Object Also known as: insert_after



64
65
66
# File 'lib/roc/objects/list.rb', line 64

def linsert_after(pivot, value)
  self.linsert('after', pivot, value)
end

#linsert_before(pivot, value) ⇒ Object Also known as: insert_before



59
60
61
# File 'lib/roc/objects/list.rb', line 59

def linsert_before(pivot, value)
  self.linsert('before', pivot, value)
end

#lrange(start_index, stop_index) ⇒ Object Also known as: range



11
12
13
# File 'lib/roc/objects/list.rb', line 11

def lrange(start_index, stop_index)
  self.call :lrange, start_index, stop_index
end

#lrem(count, val) ⇒ Object Also known as: rem



41
42
43
# File 'lib/roc/objects/list.rb', line 41

def lrem(count, val)
  self.call :lrem, count, val
end

#lset(index, val) ⇒ Object Also known as: set



33
34
35
# File 'lib/roc/objects/list.rb', line 33

def lset(index, val)
  self.call :lset, index, val
end

#ltrim(start_index, stop_index) ⇒ Object Also known as: trim



46
47
48
# File 'lib/roc/objects/list.rb', line 46

def ltrim(start_index, stop_index)
  self.call :ltrim, start_index, stop_index
end

#pop(*args) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/roc/objects/list.rb', line 159

def pop(*args)
  if 0 == args.size
    self.rpop
  elsif 1 == args.size
    (self.storage.multi do
      args[0].times do 
        self.rpop
      end
    end).reverse
  else
    raise ArgumentError, "wrong number of arguments (#{args.size} for 1)"
  end      
end

#push(*objs) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/roc/objects/list.rb', line 129

def push(*objs)
  if 1 == objs.size
    self.rpush(objs[0])
  elsif objs.size > 1
    self.storage.multi do 
      objs.each do |obj|
        self.rpush(obj)
      end
    end
  end
  self
end

#rpoplpush(other_list = self) ⇒ Object



51
52
53
# File 'lib/roc/objects/list.rb', line 51

def rpoplpush(other_list=self)
  self.call :rpoplpush, other_list.key
end

#shift(*args) ⇒ Object



173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/roc/objects/list.rb', line 173

def shift(*args)
  if 0 == args.size
    self.lpop
  elsif 1 == args.size
    (self.storage.multi do
      args[0].times do 
        self.lpop
      end
    end).reverse
  else
    raise ArgumentError, "wrong number of arguments (#{args.size} for 1)"
  end      
end

#unshift(*objs) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/roc/objects/list.rb', line 146

def unshift(*objs)
  if 1 == objs.size
    self.lpush(objs[0])
  elsif objs.size > 1
    self.storage.multi do 
      objs.reverse.each do |obj|
        self.lpush(obj)
      end
    end
  end
  self
end

#valuesObject



196
197
198
# File 'lib/roc/objects/list.rb', line 196

def values
  self.lrange(0, -1)
end