Class: Ecoportal::API::Common::Content::ArrayModel
- Inherits:
-
DoubleModel
- Object
- Common::BaseModel
- DoubleModel
- Ecoportal::API::Common::Content::ArrayModel
- Includes:
- Enumerable
- Defined in:
- lib/ecoportal/api/common/content/array_model.rb
Overview
its purpose is to handle an Array of basic objects (i.e. Date, String, Number)
Class to handle a plain Array embedded in a Hashed model.
Defined Under Namespace
Classes: TypeMismatchedComparison
Constant Summary
Constants inherited from DoubleModel
Constants included from ClassHelpers
Class Attribute Summary collapse
-
.order_matters ⇒ Object
Returns the value of attribute order_matters.
-
.uniq ⇒ Object
Returns the value of attribute uniq.
Attributes inherited from DoubleModel
Class Method Summary collapse
-
.same_type?(a, b) ⇒ Boolean
trueif both elements have same behaviour.
Instance Method Summary collapse
-
#&(value) ⇒ ArrayModel
Intersect.
-
#+(value) ⇒ Object
Concat to new.
-
#-(value) ⇒ ArrayModel
Subtract.
-
#<(values) ⇒ Object
Resets the
Arrayby keeping its reference and adds the value(s). -
#<<(value) ⇒ Object
Adds an element to the subjacent
Array. -
#==(a) ⇒ Object
Compares with an
Arrayor anotherArrayModel. -
#[](pos) ⇒ Date, ...
Retrieves the element of a certain position.
-
#[]=(post, value) ⇒ Date, ...
Sets the element of a certain position.
-
#_items ⇒ Array
The array element represented by this object.
-
#clear! ⇒ Object
Clears the
Arraykeeping its reference. - #concat!(values) ⇒ Object
-
#delete!(*values) ⇒ Object
Deletes
valuesfrom theArray. -
#dup ⇒ ArrayModel
A copy of the current object.
- #each(&block) ⇒ Object
- #empty? ⇒ Boolean
-
#include?(value) ⇒ Boolean
trueifvalueis present,falseotherwise. - #include_all?(*value) ⇒ Boolean
- #include_any?(*value) ⇒ Boolean
-
#index(value) ⇒ Integer
The position of the element in the
Array. -
#initialize(doc = {}, parent: self, key: nil) ⇒ ArrayModel
constructor
A new instance of ArrayModel.
- #insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) ⇒ Object
- #length ⇒ Object
-
#move(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) ⇒ Object
TODO.
-
#new_from(value) ⇒ ArrayModel
A new object with the current class.
- #order_matters? ⇒ Boolean
- #present? ⇒ Boolean
- #push!(value) ⇒ Object
-
#swap(value1, value2) ⇒ Integer
Swaps two values' positions.
-
#to_a ⇒ Array
A copy of the
Arrayelements. - #uniq? ⇒ Boolean
-
#|(value) ⇒ ArrayModel
Join.
Methods inherited from DoubleModel
#_doc_key, #as_json, #as_update, #consolidate!, #dirty?, #doc, embeds_many, embeds_one, #key, #key=, key?, new_uuid, #original_doc, pass_reader, pass_writer, passarray, passdate, passkey, passthrough, #print_pretty, #replace_doc, #reset!, #root, #to_json
Methods included from ClassHelpers
#inheritable_attrs, #inheritable_class_vars, #inherited, #instance_variable_name, #new_class, #resolve_class, #to_constant, #to_time, #used_param?
Constructor Details
#initialize(doc = {}, parent: self, key: nil) ⇒ ArrayModel
Returns a new instance of ArrayModel.
35 36 37 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 35 def initialize(doc = {}, parent: self, key: nil) super(doc, parent: parent, key: key) end |
Class Attribute Details
.order_matters ⇒ Object
Returns the value of attribute order_matters.
23 24 25 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 23 def order_matters @order_matters end |
.uniq ⇒ Object
Returns the value of attribute uniq.
23 24 25 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 23 def uniq @uniq end |
Class Method Details
.same_type?(a, b) ⇒ Boolean
Returns true if both elements have same behaviour.
28 29 30 31 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 28 def same_type?(a, b) raise "To use this comparison both objects should be `ArrayModel`" unless a.is_a?(ArrayModel) && b.is_a?(ArrayModel) (a.order_matters? == b.order_matters?) && (a.uniq? == b.uniq?) end |
Instance Method Details
#&(value) ⇒ ArrayModel
Intersect
181 182 183 184 185 186 187 188 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 181 def &(value) self.dup.tap do |out| self.dup.tap do |delta| delta.delete!(*into_a(value)) out.delete!(*into_a(delta)) end end end |
#+(value) ⇒ Object
Concat to new
166 167 168 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 166 def +(value) new_from(self.to_a + into_a(value)) end |
#-(value) ⇒ ArrayModel
Subtract
193 194 195 196 197 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 193 def -(value) self.dup.tap do |copy| copy.delete!(*into_a(value)) end end |
#<(values) ⇒ Object
Resets the Array by keeping its reference and adds the value(s)
153 154 155 156 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 153 def <(values) _items.clear self << values end |
#<<(value) ⇒ Object
if the class variable uniq is true, it skips duplicates
Adds an element to the subjacent Array
131 132 133 134 135 136 137 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 131 def <<(value) _items.concat(into_a(value)).tap do |doc| doc.uniq! if uniq? end on_change self end |
#==(a) ⇒ Object
Compares with an Array or another ArrayModel
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 98 def ==(a) return true if self.equal?(a) return false unless (a.class == self.class) || a.is_a?(Array) case a when Array self == new_from(a) when ArrayModel return true if raise TypeMismatchedComparison.new(this: self, that: a) unless self.class.same_type?(self, a) if self.order_matters? _items == a.to_a else (_items - a.to_a).empty? && (a.to_a - _items).empty? end end end |
#[](pos) ⇒ Date, ...
Retrieves the element of a certain position
82 83 84 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 82 def [](pos) _items[pos] end |
#[]=(post, value) ⇒ Date, ...
Sets the element of a certain position
90 91 92 93 94 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 90 def []=(post, value) _items[pos] = value on_change self[pos] end |
#_items ⇒ Array
Returns the array element represented by this object.
52 53 54 55 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 52 def _items replace_doc([]) unless doc.is_a?(Array) doc.tap {|d| d.uniq! if uniq?} end |
#clear! ⇒ Object
Clears the Array keeping its reference
159 160 161 162 163 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 159 def clear! _items.clear on_change self end |
#concat!(values) ⇒ Object
same as #push! but for multiple elements
146 147 148 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 146 def concat!(values) self << values end |
#delete!(*values) ⇒ Object
Deletes values from the Array
200 201 202 203 204 205 206 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 200 def delete!(*values) values.map do |v| deletion!(v) end.tap do |r| on_change end end |
#dup ⇒ ArrayModel
Returns a copy of the current object.
70 71 72 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 70 def dup new_from(to_a) end |
#each(&block) ⇒ Object
46 47 48 49 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 46 def each(&block) return to_enum(:each) unless block _items.each(&block) end |
#empty? ⇒ Boolean
43 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 43 def empty?; count == 0; end |
#include?(value) ⇒ Boolean
Returns true if value is present, false otherwise.
117 118 119 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 117 def include?(value) _items.include?(value) end |
#include_all?(*value) ⇒ Boolean
125 126 127 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 125 def include_all?(*value) value.all? {|v| _items.include?(v)} end |
#include_any?(*value) ⇒ Boolean
121 122 123 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 121 def include_any?(*value) value.any? {|v| _items.include?(v)} end |
#index(value) ⇒ Integer
Returns the position of the element in the Array.
75 76 77 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 75 def index(value) _items.index(value) end |
#insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) ⇒ Object
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 222 def insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) i = index(value) return i if (i && uniq?) pos = case when used_param?(pos) pos when used_param?(before) index(before) when used_param?(after) if i = index(after) i + 1 end else length end pos.tap do |i| unless !i _items.insert(pos, value) on_change end end end |
#length ⇒ Object
42 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 42 def length; count; end |
#move(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) ⇒ Object
TODO
248 249 250 251 252 253 254 255 256 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 248 def move(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) if i = index(value) unless i == pos on_change end pos end end |
#new_from(value) ⇒ ArrayModel
Returns a new object with the current class.
65 66 67 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 65 def new_from(value) self.class.new(into_a(value)) end |
#order_matters? ⇒ Boolean
39 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 39 def order_matters?; self.class.order_matters; end |
#present? ⇒ Boolean
44 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 44 def present?; count > 0; end |
#push!(value) ⇒ Object
140 141 142 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 140 def push!(value) self << value end |
#swap(value1, value2) ⇒ Integer
this will work with first instances when not uniq?
Swaps two values' positions
213 214 215 216 217 218 219 220 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 213 def swap(value1, value2) index(value2).tap do |dest| if dest && pos = index(value1) _items[dest] = value1 _items[pos] = value2 end end end |
#to_a ⇒ Array
Returns a copy of the Array elements.
59 60 61 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 59 def to_a _items.slice(0..-1) end |
#uniq? ⇒ Boolean
40 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 40 def uniq?; self.class.uniq; end |
#|(value) ⇒ ArrayModel
Join
173 174 175 176 |
# File 'lib/ecoportal/api/common/content/array_model.rb', line 173 def |(value) new = new_from(value) - self new_from(to_a + new.to_a) end |