Class: Eco::Language::Models::Collection

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/eco/language/models/collection.rb

Constant Summary collapse

ATTR_PRESENCE_METHODS =
["present", "empty", "present_all?", "present_some?"]
ATTR_COLLECTION_METHODS =
["exclude", "remove", "attr", "attr?", "attrs", "unique_attrs", "contains"] + ATTR_PRESENCE_METHODS

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data = [], klass:, factory: nil, handy: Eco::Assets::Language.new) ⇒ Collection

attr_reader :items



40
41
42
43
44
45
46
# File 'lib/eco/language/models/collection.rb', line 40

def initialize(data = [], klass:, factory: nil, handy: Eco::Assets::Language.new)
  raise "Raise klass required, given: #{klass}" if !klass
  @klass   = klass
  @factory = factory
  @handy   = handy
  @items   = to_klass(data)
end

Class Method Details

.attr_collection(*attrs) ⇒ Object



12
13
14
15
# File 'lib/eco/language/models/collection.rb', line 12

def attr_collection (*attrs)
  block = ->(method) { attrs_create_method(attrs, method) }
  ATTR_COLLECTION_METHODS.each(&block)
end

.attr_presence(*attrs) ⇒ Object



17
18
19
20
# File 'lib/eco/language/models/collection.rb', line 17

def attr_presence (*attrs)
  block = ->(method) { attrs_create_method(attrs, method) }
  ATTR_PRESENCE_METHODS.each(&block)
end

.attrs_create_method(attrs, method) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/eco/language/models/collection.rb', line 22

def attrs_create_method(attrs, method)
  attrs.each do |attr|
    attr = attr.to_s
    if method.include?("attr")
      attr_method = method.sub("attr", attr)
    else
      attr_method = "#{attr}_#{method}"
    end
    define_method attr_method do  |*args|
      send(method, attr, *args)
    end
  end
end

Instance Method Details

#<(value) ⇒ Object



78
79
80
81
# File 'lib/eco/language/models/collection.rb', line 78

def <(value)
  @items.clear
  self << value
end

#<<(value) ⇒ Object



83
84
85
86
87
# File 'lib/eco/language/models/collection.rb', line 83

def <<(value)
  @items.concat(into_a(value))
  on_change
  self
end

#attr(attr, value = true, modifier = Language::MatchModifier.new) ⇒ Object



106
107
108
109
110
111
112
113
114
115
# File 'lib/eco/language/models/collection.rb', line 106

def attr(attr, value = true, modifier = Language::MatchModifier.new)
  if !!value == value # boolean?
    present(attr, value)
  else
    return newFrom select { |object|
      attr_val = fetch_attr(object, attr)
      match?(attr_val, value, modifier)
    }
  end
end

#attr?(attr, value = true, modifier = Language::MatchModifier.new) ⇒ Boolean

Returns:

  • (Boolean)


117
118
119
120
121
122
123
124
125
# File 'lib/eco/language/models/collection.rb', line 117

def attr?(attr, value = true, modifier = Language::MatchModifier.new)
  modifier = modifier.new.reverse
  if !!value == value # boolean?
    present(attr, value).length == length
  else
    obj_vals = attrs(attr)
    return match?(obj_vals, value, modifier)
  end
end

#attrs(attr) ⇒ Object



127
128
129
# File 'lib/eco/language/models/collection.rb', line 127

def attrs(attr)
  map { |object| fetch_attr(object, attr) }
end

#contains(attr, value, modifier = Language::MatchModifier.new) ⇒ Object



152
153
154
155
# File 'lib/eco/language/models/collection.rb', line 152

def contains(attr, value, modifier = Language::MatchModifier.new)
  modifier = modifier.new.pattern
  self.attr(attr, value, modifier)
end

#delete!(value) ⇒ Object



93
94
95
# File 'lib/eco/language/models/collection.rb', line 93

def delete!(value)
  self < @items - into_a(value)
end

#each(params: {}, &block) ⇒ Object



73
74
75
76
# File 'lib/eco/language/models/collection.rb', line 73

def each(params: {}, &block)
  return to_enum(:each) unless block
  @items.each(&block)
end

#empty(attr, flag = true) ⇒ Object



140
141
142
# File 'lib/eco/language/models/collection.rb', line 140

def empty(attr, flag = true)
  present(attr, !flag)
end

#empty?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/eco/language/models/collection.rb', line 69

def empty?
  count == 0
end

#exclude(attr, value, modifier = Language::MatchModifier.new) ⇒ Object

attr dependant methods



98
99
100
# File 'lib/eco/language/models/collection.rb', line 98

def exclude(attr, value, modifier = Language::MatchModifier.new)
  newFrom @items - self.attr(attr, value, modifier)
end

#group_by(attr = nil, &block) ⇒ Object



157
158
159
160
# File 'lib/eco/language/models/collection.rb', line 157

def group_by(attr = nil, &block)
  return to_h(attr) if attr
  to_a.group_by(&block) if block
end

#lengthObject



65
66
67
# File 'lib/eco/language/models/collection.rb', line 65

def length
  count
end

#merge(data) ⇒ Object



52
53
54
55
# File 'lib/eco/language/models/collection.rb', line 52

def merge(data)
  data = data.to_a unless data.is_a?(Array)
  newFrom to_a + data
end

#newObject



61
62
63
# File 'lib/eco/language/models/collection.rb', line 61

def new
  self.class.new(to_a, klass: @klass, factory: @factory)
end

#newFrom(data) ⇒ Object



48
49
50
# File 'lib/eco/language/models/collection.rb', line 48

def newFrom(data)
  self.class.new(data, klass: @klass, factory: @factory)
end

#present(attr, flag = true) ⇒ Object



135
136
137
138
# File 'lib/eco/language/models/collection.rb', line 135

def present(attr, flag = true)
  block = ->(o) { !!fetch_attr(o, attr) == !!flag }
  newFrom select(&block)
end

#present_all?(attr, flag = true) ⇒ Boolean

Returns:

  • (Boolean)


144
145
146
# File 'lib/eco/language/models/collection.rb', line 144

def present_all?(attr, flag = true)
  present(attr, flag).length == length
end

#present_some?(attr, flag = true) ⇒ Boolean

Returns:

  • (Boolean)


148
149
150
# File 'lib/eco/language/models/collection.rb', line 148

def present_some?(attr, flag = true)
  present(attr, flag).length > 0
end

#remove(attr, value, modifier = Language::MatchModifier.new) ⇒ Object



102
103
104
# File 'lib/eco/language/models/collection.rb', line 102

def remove(attr, value, modifier = Language::MatchModifier.new)
  self < exclude(attr, value, modifier)
end

#to_cObject



57
58
59
# File 'lib/eco/language/models/collection.rb', line 57

def to_c
  Collection.new(self, klass: @klass, factory: @factory)
end

#to_h(attr) ⇒ Object



162
163
164
165
# File 'lib/eco/language/models/collection.rb', line 162

def to_h(attr)
  return {} if !attr
  to_a.group_by { |object| object.method(attr).call }
end

#unique_attrs(attr) ⇒ Object



131
132
133
# File 'lib/eco/language/models/collection.rb', line 131

def unique_attrs(attr)
  to_h(attr).keys
end

#update(&block) ⇒ Object



89
90
91
# File 'lib/eco/language/models/collection.rb', line 89

def update(&block)
  newFrom self.map(&block)
end