| 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 |