Sha256: 40498f269012436136754f343a33a1c8f26be434e50528480f0d477dd3990191

Contents?: true

Size: 1.64 KB

Versions: 3

Compression:

Stored size: 1.64 KB

Contents

module Yano
  module Lenient
    YES_MATCH_SCORE_THRESHOLD = 2
    NO_MATCH_SCORE_THRESHOLD  = 1.25

    Y_MATCH = {
      '5' => 0.25,
      '6' => 0.25,
      '7' => 0.25,
      't' => 0.75,
      'y' => 1,
      'u' => 0.75,
      'g' => 0.25,
      'h' => 0.25,
      'k' => 0.25
    }

    E_MATCH = {
      '2' => 0.25,
      '3' => 0.25,
      '4' => 0.25,
      'w' => 0.75,
      'e' => 1,
      'r' => 0.75,
      's' => 0.25,
      'd' => 0.25,
      'f' => 0.25
    }

    S_MATCH = {
      'q' => 0.25,
      'w' => 0.25,
      'e' => 0.25,
      'a' => 0.75,
      's' => 1,
      'd' => 0.75,
      'z' => 0.25,
      'x' => 0.25,
      'c' => 0.25
    }

    N_MATCH = {
      'h' => 0.25,
      'j' => 0.25,
      'k' => 0.25,
      'b' => 0.75,
      'n' => 1,
      'm' => 0.75
    }

    O_MATCH = {
      '9' => 0.25,
      '0' => 0.25,
      'i' => 0.75,
      'o' => 1,
      'p' => 0.75,
      'k' => 0.25,
      'l' => 0.25
    }

    def self.get_yes_match_score(val)
      y, e, s = val[0], val[1], val[2]
      [].tap do |score|
        score << (Y_MATCH.key?(y) ? Y_MATCH[y] : 0)
        score << (E_MATCH.key?(e) ? E_MATCH[e] : 0)
        score << (S_MATCH.key?(s) ? S_MATCH[s] : 0)
      end.reduce(:+)
    end

    def self.get_no_match_score(val)
      n, o = val[0], val[1]

      [].tap do |score|
        score << (N_MATCH.key?(n) ? N_MATCH[n] : 0)
        score << (O_MATCH.key?(o) ? O_MATCH[o] : 0)
      end.reduce(:+)
    end

    def self.check_lenient_values(val)
      return true  if get_yes_match_score(val) >= YES_MATCH_SCORE_THRESHOLD
      return false if get_no_match_score(val)  >= NO_MATCH_SCORE_THRESHOLD
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
yano-0.1.2 lib/yano/lenient.rb
yano-0.1.1 lib/yano/lenient.rb
yano-0.1.0 lib/yano/lenient.rb