Class: SumSum

Inherits:
Hash
  • Object
show all
Defined in:
lib/sum_sum.rb,
lib/sum_sum/version.rb

Constant Summary collapse

VERSION =
"0.0.4"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ SumSum

Returns a new instance of SumSum.



2
3
4
5
6
7
8
# File 'lib/sum_sum.rb', line 2

def initialize(*args)
  @parent = args.pop if args[-1].is_a?(self.class)
  @name = args.shift
  @args = args.compact.dup
  @count = 0
  super()
end

Instance Attribute Details

#argsObject (readonly)

Returns the value of attribute args.



10
11
12
# File 'lib/sum_sum.rb', line 10

def args
  @args
end

#countObject (readonly)

Returns the value of attribute count.



10
11
12
# File 'lib/sum_sum.rb', line 10

def count
  @count
end

#nameObject (readonly)

Returns the value of attribute name.



10
11
12
# File 'lib/sum_sum.rb', line 10

def name
  @name
end

#parentObject (readonly)

Returns the value of attribute parent.



10
11
12
# File 'lib/sum_sum.rb', line 10

def parent
  @parent
end

Class Method Details

.load(data) ⇒ Object



60
61
62
63
64
# File 'lib/sum_sum.rb', line 60

def self.load(data)
  new(*data[0]).tap do |sum_sum|
    sum_sum.add_from_dump(data[1])
  end
end

Instance Method Details

#add(hash, increase_by = 1) ⇒ Object



12
13
14
15
16
17
18
19
20
# File 'lib/sum_sum.rb', line 12

def add(hash, increase_by=1)
  key = hash[name]
  @count = @count + increase_by
  unless bottom?
    self[key] ||= SumSum.new(*args, self)
    self[key].add(hash, increase_by)
  end
  self
end

#add_from_dump(data, hash = {}, level = 0) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/sum_sum.rb', line 66

def add_from_dump(data, hash={}, level=0)
  data.each do |key, value|
    hash[all_args[level]] = key
    value.is_a?(Hash) ?
      add_from_dump(value, hash, level + 1) :
      add(hash, value)
  end
end

#bottom?Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/sum_sum.rb', line 40

def bottom?
  name.nil?
end

#dumpObject



53
54
55
56
57
58
# File 'lib/sum_sum.rb', line 53

def dump
  return count if bottom?
  hash = {}
  each{ |k, v| hash[k] = v.dump }
  root? ? [all_args, hash] : hash
end

#inspectObject



44
45
46
# File 'lib/sum_sum.rb', line 44

def inspect
  bottom? ? "#{count}" : "{#{name}:#{count} #{super.gsub(/^\{|\}$/, "")}}"
end

#pretty_print(pp) ⇒ Object



48
49
50
51
# File 'lib/sum_sum.rb', line 48

def pretty_print(pp)
  return pp.text(" #{count}") if bottom?
  super
end

#root?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/sum_sum.rb', line 36

def root?
  parent.nil?
end

#shareObject



22
23
24
# File 'lib/sum_sum.rb', line 22

def share
  root? ? 1.0 : count/parent.count.to_f
end

#sort!Object



26
27
28
29
30
31
32
33
34
# File 'lib/sum_sum.rb', line 26

def sort!
  return self if bottom?
  values.each(&:sort!)
  to_a.sort_by{|it| it[1].count}.reverse.tap do |array|
    clear
    array.each{|k, v| self[k] = v }
  end
  self
end