Total Complexity | 14 |
Total Lines | 73 |
Duplicated Lines | 0 % |
Changes | 3 | ||
Bugs | 0 | Features | 0 |
1 | require 'forwardable' |
||
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 |
||
80 |