Class: Teletype::Stats

Inherits:
Object
  • Object
show all
Defined in:
lib/teletype/stats.rb

Overview

Stats keep track of hit/miss rate for pair of keys. It also has suggestions for keys that need more practice.

Defined Under Namespace

Classes: Pair

Instance Method Summary collapse

Constructor Details

#initialize(profile, text) ⇒ Stats

Returns a new instance of Stats.



7
8
9
10
11
12
# File 'lib/teletype/stats.rb', line 7

def initialize(profile, text)
  @file = File.join(profile, 'stats')
  @previous = nil
  @pairs = {}
  load(text)
end

Instance Method Details

#hit!(key) ⇒ Object



30
31
32
# File 'lib/teletype/stats.rb', line 30

def hit!(key)
  lookup(key)&.hit!
end

#load(text) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/teletype/stats.rb', line 14

def load(text)
  return unless File.exist?(@file)

  File.readlines(@file).each do |line|
    keys, hit, miss = line.split("\t")
    @pairs[keys] = Pair.new(keys,
                            hit: Integer(hit),
                            miss: Integer(miss),
                            available: text.scan(keys).count.positive?)
  end
end

#lookup(key) ⇒ Object



38
39
40
41
42
43
44
45
# File 'lib/teletype/stats.rb', line 38

def lookup(key)
  current = key.downcase
  keys = "#{@previous}#{current}"
  @previous = current
  return if keys.strip.length < 2

  @pairs[keys] ||= Pair.new(keys)
end

#miss!(key) ⇒ Object



34
35
36
# File 'lib/teletype/stats.rb', line 34

def miss!(key)
  lookup(key)&.miss!
end

#rankingsObject



51
52
53
# File 'lib/teletype/stats.rb', line 51

def rankings
  @pairs.values.select(&:available).sort.first(10).map(&:to_s).join(' ')
end

#saveObject



26
27
28
# File 'lib/teletype/stats.rb', line 26

def save
  File.write(@file, @pairs.map { |k, p| [k, p.hit, p.miss].join("\t") }.join("\n"))
end

#suggestionsObject



47
48
49
# File 'lib/teletype/stats.rb', line 47

def suggestions
  @pairs.values.select(&:available).select(&:inefficient?).sort.map(&:keys)
end