Completed
Push — master ( d39807...d178cf )
by Marcelo
01:07
created

Entries.slowest()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
require 'forwardable'
2
3
module Koine
4
  class Profiler
5
    class Entries
6
      extend Forwardable
7
8
      def_delegators :storage, :size
9
      def_delegators :to_a, :each
10
11
      def initialize(groups = [])
12
        @storage = Hash.new
13
        groups.each { |group| append_group(group) }
14
      end
15
16
      def append(name, time)
17
        group = find_by_name(name) || create_group(name)
18
        append_to_group(group, name, time)
19
      end
20
21
      def find_by_name(name)
22
        storage[name.to_s]
23
      end
24
25
      def elapsed_time
26
        storage.inject(0) do |total, (_key, group)|
27
          total + group.elapsed_time
28
        end
29
      end
30
31
      def sort_by(&_block)
32
        sorted = storage.sort_by { |item| yield(item[1]) }.map {|_key, group| group }
33
        create(sorted)
34
      end
35
36
      def reverse
37
        create(storage.to_a.reverse.map { |_key, group| group })
38
      end
39
40
      def slowest
41
        sort_by(&:elapsed_time).reverse
42
      end
43
44
      def to_a
45
        storage.values
46
      end
47
48
      def limit(number)
49
        create(to_a.slice(0, number.to_i))
50
      end
51
52
      def ==(other)
53
        storage.to_a == other.storage.to_a
54
      end
55
56
      private
57
58
      def create(groups = [])
59
        self.class.new(groups)
60
      end
61
62
      def create_group(name)
63
        append_group(EntryGroup.new(name))
64
      end
65
66
      def append_group(group)
67
        storage[group.name] = group
68
      end
69
70
      def append_to_group(group, name, time)
71
        group.append(Entry.new(name, time))
72
      end
73
74
      protected
75
76
      attr_reader :storage
77
    end
78
  end
79
end
80