Class: Kotoshu::Suggestions::SuggestionSet

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/kotoshu/suggestions/suggestion_set.rb

Overview

A collection of suggestions with rich query methods. This is MORE OOP than Spylls which returns plain iterators of strings.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(suggestions = [], max_size: 10) ⇒ SuggestionSet

Returns a new instance of SuggestionSet.

Parameters:

  • suggestions (Array<Suggestion>) (defaults to: [])

    Initial suggestions

  • max_size (Integer) (defaults to: 10)

    Maximum number of suggestions to keep



16
17
18
19
20
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 16

def initialize(suggestions = [], max_size: 10)
  @suggestions = suggestions
  @max_size = max_size
  sort_and_limit!
end

Instance Attribute Details

#max_sizeObject (readonly)

Returns the value of attribute max_size.



12
13
14
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 12

def max_size
  @max_size
end

#suggestionsObject (readonly)

Returns the value of attribute suggestions.



12
13
14
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 12

def suggestions
  @suggestions
end

Class Method Details

.empty(max_size: 10) ⇒ SuggestionSet

Create an empty suggestion set.

Parameters:

  • max_size (Integer) (defaults to: 10)

    Maximum size

Returns:



212
213
214
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 212

def self.empty(max_size: 10)
  new([], max_size: max_size)
end

.from_words(words, source: :unknown, max_size: 10) ⇒ SuggestionSet

Create a suggestion set from an array of words.

Parameters:

  • words (Array<String>)

    Array of words

  • source (String, Symbol) (defaults to: :unknown)

    The source

  • max_size (Integer) (defaults to: 10)

    Maximum size

Returns:



222
223
224
225
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 222

def self.from_words(words, source: :unknown, max_size: 10)
  suggestions = words.map { |w| Suggestion.from_word(w, source: source) }
  new(suggestions, max_size: max_size)
end

Instance Method Details

#add(suggestion) ⇒ SuggestionSet Also known as: <<

Add a suggestion to the set.

Parameters:

  • suggestion (Suggestion)

    The suggestion to add

Returns:



26
27
28
29
30
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 26

def add(suggestion)
  @suggestions << suggestion
  sort_and_limit!
  self
end

#as_jsonArray<Hash>

Convert to JSON-compatible array.

Returns:

  • (Array<Hash>)

    JSON-compatible array



186
187
188
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 186

def as_json(*)
  to_a
end

#concat(new_suggestions) ⇒ SuggestionSet

Add multiple suggestions.

Parameters:

  • new_suggestions (Array<Suggestion>)

    Suggestions to add

Returns:



37
38
39
40
41
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 37

def concat(new_suggestions)
  @suggestions.concat(new_suggestions)
  sort_and_limit!
  self
end

#each {|suggestion| ... } ⇒ Enumerator

Iterate over suggestions.

Yields:

  • (suggestion)

    Each suggestion

Returns:

  • (Enumerator)

    Enumerator if no block given



145
146
147
148
149
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 145

def each(&block)
  return enum_for(:each) unless block_given?

  @suggestions.each(&block)
end

#empty?Boolean

Check if the set is empty.

Returns:

  • (Boolean)

    True if no suggestions



128
129
130
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 128

def empty?
  @suggestions.empty?
end

#find_word(word) ⇒ Suggestion?

Find a suggestion by word.

Parameters:

  • word (String)

    The word to find

Returns:



99
100
101
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 99

def find_word(word)
  @suggestions.find { |s| s.same_word?(word) }
end

#firstSuggestion?

Get the first (best) suggestion.

Returns:

  • (Suggestion, nil)

    The best suggestion or nil



114
115
116
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 114

def first
  @suggestions.first
end

#from_source(source) ⇒ SuggestionSet

Get suggestions by source.

Parameters:

  • source (String, Symbol)

    The source to filter by

Returns:



56
57
58
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 56

def from_source(source)
  SuggestionSet.new(@suggestions.select { |s| s.from_source?(source) }, max_size: @max_size)
end

#high_confidenceSuggestionSet

Get high-confidence suggestions.

Returns:



63
64
65
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 63

def high_confidence
  SuggestionSet.new(@suggestions.select(&:high_confidence?), max_size: @max_size)
end

#include?(word) ⇒ Boolean Also known as: has_word?

Check if set contains a specific word.

Parameters:

  • word (String)

    The word to check

Returns:

  • (Boolean)

    True if word is in suggestions



90
91
92
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 90

def include?(word)
  @suggestions.any? { |s| s.same_word?(word) }
end

#inspectString

Inspect the suggestion set.

Returns:

  • (String)

    Inspection string



200
201
202
203
204
205
206
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 200

def inspect
  if @suggestions.empty?
    to_s
  else
    "#{self} [#{@suggestions.map(&:word).join(", ")}]"
  end
end

#lastSuggestion?

Get the last suggestion.

Returns:

  • (Suggestion, nil)

    The last suggestion or nil



121
122
123
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 121

def last
  @suggestions.last
end

#low_confidenceSuggestionSet

Get low-confidence suggestions.

Returns:



70
71
72
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 70

def low_confidence
  SuggestionSet.new(@suggestions.select(&:low_confidence?), max_size: @max_size)
end

#merge!(other) ⇒ SuggestionSet

Merge another suggestion set into this one.

Parameters:

Returns:



47
48
49
50
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 47

def merge!(other)
  concat(other.suggestions)
  self
end

#sizeInteger Also known as: count, length

Get the number of suggestions.

Returns:

  • (Integer)

    Number of suggestions



135
136
137
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 135

def size
  @suggestions.size
end

#to_aArray<Hash>

Convert to array of hashes.

Returns:

  • (Array<Hash>)

    Array of suggestion hashes



179
180
181
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 179

def to_a
  @suggestions.map(&:to_h)
end

#to_sString

String representation.

Returns:

  • (String)

    String representation



193
194
195
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 193

def to_s
  "SuggestionSet(size: #{size}, max_size: #{@max_size})"
end

#to_wordsArray<String> Also known as: words

Convert to array of words.

Returns:

  • (Array<String>)

    Array of suggestion words



171
172
173
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 171

def to_words
  @suggestions.map(&:word)
end

#top(n) ⇒ Array<Suggestion>

Get the top N suggestions.

Parameters:

  • n (Integer)

    Number of suggestions to get

Returns:



107
108
109
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 107

def top(n)
  @suggestions.first(n)
end

#uniqueSuggestionSet

Get unique suggestions (by word, case-insensitive).

Returns:



154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 154

def unique
  seen = {}
  unique_suggestions = @suggestions.select do |s|
    word = s.word.downcase
    if seen[word]
      false
    else
      seen[word] = true
      true
    end
  end
  SuggestionSet.new(unique_suggestions, max_size: @max_size)
end

#within_distance(min_distance: 0, max_distance: 2) ⇒ SuggestionSet

Get suggestions within a distance range.

Parameters:

  • min_distance (Integer) (defaults to: 0)

    Minimum distance

  • max_distance (Integer) (defaults to: 2)

    Maximum distance

Returns:



79
80
81
82
83
84
# File 'lib/kotoshu/suggestions/suggestion_set.rb', line 79

def within_distance(min_distance: 0, max_distance: 2)
  filtered = @suggestions.select do |s|
    s.distance >= min_distance && s.distance <= max_distance
  end
  SuggestionSet.new(filtered, max_size: @max_size)
end